[英]Node.js REST API - URI Sanitizing?
我想基于请求的URI要求Node.js服务器中的页面。
但是,我担心这可能是一个严重的安全问题,因为用户可以向URL中注入一些恶意字符,例如../../
并到达我的根服务器点并显示所有代码。
因此,就像将一瓶水扔到大火上一样,我取消了发送的选择.
的要求。
这不是银弹,可能是:)
关于基于Node.js的REST API中的URI消毒,也许有一些标准/最佳实践/指南或要点吗?
编辑-这里的代码使用require
// app.js
app.use(require('./services/router')(app));
// router.js middleware
function router(app) {
return function(req, res, next) {
try {
// checking for . in the url
if (req.url.indexOf(".")!=-1) cast.badRequest();
// req.url.split('/')[2] should be customers, users or anything else
require('../../resources/' + req.url.split('/')[2] + '/' + req.url.split('/')[2] + '-router')(app);
next();
} catch(err) { cast.notFound(); }
}
}
module.exports = router;
// rides-router.js (this could be users-router.js or customers-router.js)
module.exports = function(app) {
// GET ride - select a ride
app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1-get-ride'));
// POST ride - insert a new ride
app.post("/v1/rides", dep.verifyToken(), require('./api/v1-set-ride'));
app.use((req, res, next) => {
cast.notFound();
});
}
您问如何做得更安全。 我的建议是,将所有资源放在一个数组中,并通过一个循环运行所有app.use()
语句,该循环在服务器启动时从数组中提取资源名称。
我不喜欢在请求期间运行同步require()
,也不喜欢根据用户指定的字符加载代码。 我的建议都避免了两者。
// add routes for all resources
const resourceList = ['rides', 'products', ...];
for (let r of resourceList) {
app.use(`/${r}`, require(`./resources/${r}/${r}-router`));
}
这似乎更少的代码,并且100%安全,并且在请求期间没有运行同步require()
。
好处:
require()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.