Express res.sendfile抛出禁止错误


160

我有以下代码:

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)

谁能告诉我为什么会这样吗?


3
我相信这是因为相对的路径。“ ../”被认为是恶意的。首先解析本地路径,然后致电res.sendfile
Joe

您如何解析本地路径?

4
path.resolve应该做你需要的。

1
做到了。想要过去作为答案吗?

Answers:


285

我相信这是因为相对的路径。“ ../”被认为是恶意的。首先解析本地路径,然后调用res.sendfile。您可以path.resolve事先解析路径。

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

31
对于像我这样的新手,更多详细信息将在这里很方便
Adam Waite

5
Express认为相对路径sendfile不好。除非您指定root目录参数,如此处所示:github.com/visionmedia/express/issues/1465
Joe Joe

2
var path = require('path');
马特·哈里森

1
是的,最终的鳕鱼!
SuperUberDuper '16

2
对于软件包导入,@ MattHarrison ES6更新const优于var
Nino Filiu

39

该答案从其他答案/评论中收集信息。

这取决于您是否要包含与流程工作目录(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')可能是黑客的首次尝试),则相对路径会带来安全风险。


1
作为一个新手,我想知道黑客场景是怎么来的?
bharath muppa 2015年

2
如果您不小心允许用户输入要下载的文件的路径,则他们可以下载系统上的任何文件(我以ssh私钥为例-这使他们可以假装成您的PC(中间人等))。..限制不允许这种可能性,因为只能访问网站中的文件。
derekdreery 2015年

30

Express文档建议做一个不同的方式,在我看来,它更有意义比当前解决方案更高版本。

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

root选项似乎已设置./为项目的根目录。因此,我无法完全确定文件相对于项目根目录的位置,但是如果您的temp文件夹在那里,则可以将其设置./temp为要发送的文件的根目录。


1
的确如此,但是它使用sendFile(大写F,Express v4.8.0及更高版本支持),而不是OP使用的较旧的sendfile。只是说... =]
RemyNL '16

啊...好抓。我没有注意到这种微小的差异。我也想知道所选答案是否有效,不是因为使用了答案,.sendfile而是因为它完全依赖于其他内容(路径)。感谢您指出了这一点。
tenor528

简单高效。谢谢!这完全适合我!
伊曼纽拉·科尔塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.