Node.js REST API-URI清理?
我希望根据请求的URI要求Node.js服务器中的页面 然而,我担心这可能是一个严重的安全问题,因为用户可以向url中注入一些恶意字符,比如Node.js REST API-URI清理?,node.js,rest,api,security,uri,Node.js,Rest,Api,Security,Uri,我希望根据请求的URI要求Node.js服务器中的页面 然而,我担心这可能是一个严重的安全问题,因为用户可以向url中注入一些恶意字符,比如。/../,然后到达我的根服务器点并显示所有代码 因此,就像向大火中扔一瓶水一样,我取消了向请求发送的选项 这可能不是银弹:) 也许在基于Node.js的RESTAPI中有一些关于URI清理的标准/最佳实践/指南或要点 编辑-此处代码使用require // app.js app.use(require('./services/router')(app));
。/../
,然后到达我的根服务器点并显示所有代码
因此,就像向大火中扔一瓶水一样,我取消了向请求发送
的选项
这可能不是银弹:)
也许在基于Node.js的RESTAPI中有一些关于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()
语句,并在服务器启动时使用一个循环从数组中提取资源名称
我不喜欢在请求期间运行synchronousrequire()
,也不喜欢根据用户指定的字符加载代码。我的建议避免了这两种情况
// 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()
你能解释一下实际的问题吗?为什么你要尝试
require()
基于URI的页面?我们可能会想出一个更好的方法,不易受到URL注入的影响。现在你的问题是,你已经描述了一个问题,以及你对其他一些问题的解决方案,你还没有分享。也许我们可以帮助您找到原始问题的痛苦解决方案。我将编辑我的问题-添加我的代码。您仍然没有根据URL中的信息解释为什么要使用require()
。这是不寻常的,因为它允许一个用户在服务器上运行可能影响所有人的东西。代码应该做什么?为什么动态运行require()
?我在app.js中有一个主路由器-想想政府大楼的大厅警卫。问你:我能为你做什么?你向他展示你的请求,然后他将请求发送给应该分别处理的部门。如果找不到指定的地址,或者出现问题,则会出现错误。如果地址正确,则有一个中间路由器处理所有只针对其类的请求。这在我的应用程序中命名为:NAME-router.js,路径为:resources/NAME/NAME-router.js。在那里你可以看到所有的express方法,比如app.get-app.post-app.put,都是由hanlers处理的。这不是正常的处理方式。通常,您会在服务器启动时为其提供所有功能,然后定义使用这些功能的URL。注册并等待使用功能不会带来任何有意义的成本,因此通常没有理由动态加载东西。我仍然不知道为什么您要尝试根据您以前不知道的某个URL动态加载代码。