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 に答える