0

我有以下代码:

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最终可能会成为邪恶的东西../..,例如读取我不想被看到的文件。

这可能吗?如果是这样,我该如何解决这个安全问题?

4

1 回答 1

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' ]
}

http://expressjs.com/api.html#req.route

于 2012-08-13T18:09:57.627 回答