Node.js REST API-URI清理?

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));

我希望根据请求的URI要求Node.js服务器中的页面

然而,我担心这可能是一个严重的安全问题,因为用户可以向url中注入一些恶意字符,比如
。/../
,然后到达我的根服务器点并显示所有代码

因此,就像向大火中扔一瓶水一样,我取消了向请求发送
的选项

这可能不是银弹:)

也许在基于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()
语句,并在服务器启动时使用一个循环从数组中提取资源名称

我不喜欢在请求期间运行synchronous
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()
  • 服务器初始化时安装的所有路由
  • 路由加载中的任何错误(如丢失的路由文件)都发生在服务器启动时,而不是在用户请求期间

  • 你能解释一下实际的问题吗?为什么你要尝试
    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动态加载代码。