`app.use(' /:module')`是一种在Express中使用的安全模式吗?

时间:2014-05-25 16:02:56

标签: node.js security express

在我的快速应用程序中,我想使用嵌套路由。我想拥有一个用户可以添加的模块目录(以启用额外的功能)。我想使用以下模式路由到正确的模块:

app.use('/:module', function(req, res) {
  var module_router = require('/path/to/modules/'+req.params.module+'/router.js');
  app.use(req.params.module, module_router);
}

这会将请求传递给正确的模块路由器 - 并且它不依赖于知道主代码中可用的模块。我的问题是:我可以依赖:module安全的内容(即只有字母数字)。我只是想知道一个讨厌的人是否可以将'../'的html转义序列放入或类似的东西。

2 个答案:

答案 0 :(得分:1)

您可以在中间件中进行RegEx检查,也可以使用app.param()确保其为字母数字。

即使它通过了字母数字测试,如果require()中的评估路径不存在,也会引发错误。如果文件存在,请先进行测试。

答案 1 :(得分:1)

参数值基本上是除/之外的任何字符。

您可以提前将所有模块预加载到一个对象中,然后可以安全地在中间件中进行查找。

您还可以使用内置的path模块,如:

var normalize = require('path').normalize;

var basePath = '/path/to/modules/';

function getRouter(moduleName) {
  var origPath = basePath + moduleName + '/router.js',
      path = normalize(origPath),
      ret;
  if (path.indexOf(basePath) !== 0)
    return;
  try {
    ret = require(path);
  } catch (ex) {}
  return ret;
}

app.use('/:module', function(req, res) {
  var module_router = getRouter(req.params.module);
  if (module_router)
    app.use(req.params.module, module_router);
  else
    res.send(400);
}