我有以下代码:
app.get('/games/:id/log', function (req, res) {
fs.readFile('logs/' + req.params.id +'.log', 'utf8', function (err, data) {
res.send(data.split('\n').join('\<br />'));
});
});
允许访问mysite.com/games/somename/log
以提供./logs/somename.log
。但是,我担心req.params.id
最终可能会变成像../..
那样邪恶的东西,读取我不想看到的文件。
这可能吗?如果是这样,我该如何解决这个安全问题呢?
答案 0 :(得分:0)
我会在你的id中创建一个白色的字符列表。我的猜测是你的id只能是字母字符。因此,运行测试将允许您拒绝所有其他值。
var id = req.params.id.match(/[A-Z]+/i
id = id[0] || null
if (id) {
// read file `id`
}
这将清除您的输入,只允许使用大写和小写字母字符。您还可以测试有效字符的输入,而不仅仅是清理它。
var reg = /^[A-Z]+$/i
if (reg.test(req.params.id)) {
// read file `req.params.id`
}
另请注意:您永远无法将../..
作为id
的值,因为它与您的路由不符。
您可以通过req.route
您的路线示例如下:
{ path: '/games/:id/log',
method: 'get',
callbacks: [ [Function] ],
keys: [ { name: 'id', optional: false } ],
regexp: /^\/games\/(?:([^\/]+?))\/log\/?$/i,
params: [ id: 'asd' ] } [ id: 'asd' ]
}