2

静的ファイルを提供するための最も単純なnode.jsサーバーを作成したいと思います。

これが私が思いついたものです:

fs = require('fs');
server = require('http').createServer(function(req, res) {
    res.end(fs.readFileSync(__dirname + '/public/' + req.url));
});
server.listen(8080);

明らかに、これはにマップhttp://localhost:8080/index.htmlされproject_dir/public/index.html、他のすべてのファイルにも同様にマップされます。

私の1つの懸念は、誰かがこれを悪用して、の外部のファイルにアクセスする可能性があることですproject_dir/public。たとえば、次のようなものです。

http://localhost:8080/../../sensitive_file.txt

これを少し試してみましたが、うまくいきませんでした。しかし、私のブラウザは「..」自体を削除していたようです。これは、誰かが私のかわいそうなnode.jsサーバーを悪用する可能性があると私に信じさせます。

静的ファイル提供を行うnpmパッケージがあることを私は知っています。しかし、私は実際にここに自分自身を書くことに興味があります。だから私の質問は:

  1. これは安全ですか?

  2. もしそうなら、なぜですか?そうでない場合は、なぜですか?

  3. そして、さらにそうでない場合、これを行うための「正しい」方法は何ですか?私の1つの制約は、可能なファイルごとにif句を設定する必要がないことです。ディレクトリにスローするファイルはすべて、サーバーに提供させます。

4

2 に答える 2

0
  1. いいえ、安全ではありません。
  2. あなたが言及する理由のために。
  3. fs.realpath()またはを使用fs.realpathSync()して、正規化されたパスが目的の場所を指していることを確認します。
于 2012-06-03T21:07:09.160 に答える
-3

安全ではないので、次のようなものを使用してください。

if (req.url.indexOf('..') !== -1) {
    res.writeHead(404);
    res.end();
}

PS:ちなみに、readFileSyncの代わりにreadFileを使用して、エラーに注意してください...例でも実装が悪すぎます-_-

于 2012-06-01T17:30:53.697 に答える