181

私はこのコードを持っています:

res.sendfile( '../../temp/index.html' )

ただし、次のエラーがスローされます。

Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)

これがなぜなのか誰か教えてもらえますか?

4

4 に答える 4

321

私はそれが相対的な道のせいであると信じています。「../」は悪意があると見なされます。最初にローカルパスを解決してから、を呼び出しますres.sendfilepath.resolve事前にパスを解決できます。

var path = require('path');
res.sendFile(path.resolve('temp/index.html'));
于 2013-01-29T23:52:21.547 に答える
42

この回答は、他の回答/コメントからの情報をまとめたものです。

プロセスの作業ディレクトリ (cwd) またはファイル ディレクトリに関連するものを含めるかどうかによって異なります。どちらもpath.resolve関数を使用します (var path = require('path')ファイルの先頭に配置します。

  • cwd に対して:path.resolve('../../some/path/to/file.txt');
  • ファイルに相対的:path.resolve(__dirname+'../../some/path/to/file.txt');

@Joe のコメントからリンクを読むと、パスのユーザー入力を受け入れる場合、相対パスはセキュリティ上のリスクがあるように思えます (たとえばsendfile('../.ssh/id_rsa')、ハッカーの最初の試みである可能性があります)。

于 2014-03-02T22:01:34.053 に答える