Node.js 是否可以通过request.url进行目录遍历?

Node.js 是否可以通过request.url进行目录遍历?,node.js,Node.js,我来自PHP,您可以在URL中注入双点来尝试目录遍历。在NodeJS中,您似乎得到了Httpwebserver自动从URL中删除双点 例如,如果您转到http://example.com/static/../app.js,节点似乎重定向到http://example.com/app.js,在我的例子中,它会抛出一个404,因为没有以/static/开头的URL的回调 在使用HTTP包创建的NodeJS HTTP Web服务器中,通过请求.url进行目录遍历是安全的吗?我想说,您可以确定这是不可能

我来自PHP,您可以在URL中注入双点来尝试目录遍历。在NodeJS中,您似乎得到了
Http
webserver自动从URL中删除双点

例如,如果您转到
http://example.com/static/../app.js
,节点似乎重定向到
http://example.com/app.js
,在我的例子中,它会抛出一个404,因为没有以
/static/
开头的URL的回调


在使用
HTTP
包创建的NodeJS HTTP Web服务器中,通过
请求.url
进行目录遍历是安全的吗?

我想说,您可以确定这是不可能的,然后我尝试了,我不得不说,不,HTTP模块似乎没有删除“/../”。您看到的重定向是在浏览器中完成的。因此,是否存在安全风险取决于静态处理程序的实现方式

概念证明:

// Server
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(req.url);
}).listen(1337);
卷曲它:

curl  --path-as-is "http://localhost:1337/static/../app.js"
# /static/../app.js
所以,如果你使用一个只使用path.resolve()的自制静态处理程序,你就完蛋了。希望像express.static这样受欢迎的网站已经考虑过这个问题,但我还没有尝试过

更新


Express的响应确实是404“Error:probled”。

注意curl将删除“/../”。尝试使用
curl--path as is“http://localhost:1337/static/../app.js“