Node.js REST API-URI清理?

时间:2018-07-30 05:13:22

标签: node.js rest api security uri

我想基于请求的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();
  });

}

1 个答案:

答案 0 :(得分:1)

您问如何做得更安全。我的建议是,将所有资源放在一个数组中,并通过一个循环运行所有 android { packagingOptions{ exclude 'com/google/api/AuthPhoto' //OR pickFist 'com/google/api/AuthPhoto' } } 语句,该循环在服务器启动时从数组中提取资源名称。

我不喜欢在请求过程中运行同步app.use(),也不喜欢根据用户指定的字符加载代码。我的建议都避免了两者。

require()

这似乎更少的代码,而且100%安全,并且在请求期间没有运行同步// add routes for all resources const resourceList = ['rides', 'products', ...]; for (let r of resourceList) { app.use(`/${r}`, require(`./resources/${r}/${r}-router`)); }

优势:

  1. 完全列入白名单。
  2. 选择要运行的代码时无需用户输入。
  3. 在请求处理期间没有同步require()
  4. 在服务器初始化时安装的所有路由。
  5. 路由加载中的任何错误(例如缺少路由文件)都在服务器启动时发生,而不是在用户请求期间发生。
相关问题