Node.js Express res.sendfile抛出禁止的错误
我有以下代码:Node.js Express res.sendfile抛出禁止的错误,node.js,express,Node.js,Express,我有以下代码: 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/Per
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)
有人能告诉我为什么会这样吗?我相信这是因为相对路径;“./”被认为是恶意的。首先解析本地路径,然后调用
res.sendfile
。您可以使用path.resolve
预先解析路径
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');
- 相对于文件:
path.resolve(uu dirname+'../some/path/to/file.txt');
sendfile('../.ssh/id_rsa')
可能是黑客的第一次尝试),则相对路径听起来像是一种安全风险。建议使用不同的方法,而且在我看来,它比当前的解决方案更具意义
res.sendFile('index.html',{root:'./temp'});
root选项似乎将
/
设置为项目的根目录。因此,我无法完全确定文件相对于项目根目录的位置,但如果临时文件夹在那里,则可以将/temp
设置为要发送的文件的根目录。此外,还可以使用路径。join
const path=require(“路径”);
路由器.get(“/”,(请求,res)=>{
让indexath=path.join(_dirname,“../public/index.html”);
res.sendFile(indexPath);
});
我相信这是因为相对路径;“../”的原因被认为是恶意的。首先解析本地路径,然后调用res.sendfile
如何解析本地路径?path。解析
应该做你需要做的事情。就是这样。想要通过它作为答案吗?对于像meExpress这样的新手来说,更多详细信息会很方便,因为他们认为sendfile
中的相对路径很糟糕。除非你指定root
目录参数,如下所示:var path=require('path'));是的,最后的代码!!@MattHarrison ES6 update,对于软件包导入,const
比var
更受欢迎作为一个新手,我想知道黑客场景是如何出现的?如果你不小心允许用户输入他们想要下载的文件路径,他们可以下载你系统上的任何文件(我举了一个ssh私钥的例子-这将使他们能够假装是你的电脑(中间人等)。有..限制不允许这种可能性,因为只有来自网站的文件可以访问。这是真的,但它使用sendFile(大写F,由Express v4.8.0支持)OP使用的不是旧的sendfile。只是说…=]Ahh…捕捉得好。我没有注意到这个小差异。我还想知道选择的答案是否有效,不是因为它使用.sendfile
,而是因为它完全依赖于其他东西(路径).谢谢你指出这一点。简单而有效。谢谢!这对我非常有效!