快递res.sendfile抛出禁止的错误

我有这个代码:

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) 

谁能告诉我为什么这可能是?

我相信这是因为相对的path; “../”被认为是恶意的。 先parsing本地path,然后调用res.sendfile 。 您可以预先使用path.resolveparsingpath。

 var path = require('path'); res.sendFile(path.resolve('temp/index.html')); 

这个答案收集来自其他答案/评论的信息。

这取决于您是否要包含与进程工作目录(cwd)或文件目录相关的内容。 两者都使用path.resolve函数(把var path = require('path')放在文件的顶部。

  • 相对于cwd: path.resolve('../../some/path/to/file.txt');
  • 相对于file: path.resolve(__dirname+'../../some/path/to/file.txt');

从阅读@ Joe的评论链接,听起来像相对path是安全风险,如果你接受用户input的path(例如sendfile('../.ssh/id_rsa')可能是黑客的第一次尝试)。

Express文档build议以不同的方式进行,在我看来,这比现在的解决scheme更有意义。

res.sendFile('index.html', {root: './temp});

根选项似乎将./设置为项目的根目录。 所以我不能完全知道你的文件在哪里与项目根目录有关,但是如果你的临时文件夹在那里,你可以设置./temp作为你发送文件的根目录。