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.sendfile. path.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');

sendfile('../.ssh/id_rsa')通过阅读@Joe 评论中的链接,如果您接受用户对路径的输入(例如,可能是黑客的第一次尝试),听起来相对路径会带来安全风险。

于 2014-03-02T22:01:34.053 回答
34

Express 文档建议以不同的方式进行操作,在我看来,它比当前的解决方案更有意义。

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

root 选项似乎设置./为项目的根目录。因此,我无法完全确定您的文件与项目根目录的关系,但如果您的临时文件夹在那里,您可以将其设置./temp为您要发送的文件的根目录。

于 2016-02-09T19:45:27.783 回答
1

此外,您可以使用path.join

const path = require("path");

router.get("/", (req, res) => {
  let indexPath = path.join(__dirname, "../public/index.html");
  res.sendFile(indexPath);
});

于 2021-05-22T08:59:23.567 回答