在我的快速应用程序中,我想使用嵌套路由。我想拥有一个用户可以添加的模块目录(以启用额外的功能)。我想使用以下模式路由到正确的模块:
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转义序列放入或类似的东西。
答案 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);
}