2

我想创建最简单的 node.js 服务器来提供静态文件。

这是我想出的:

fs = require('fs');
server = require('http').createServer(function(req, res) {
    res.end(fs.readFileSync(__dirname + '/public/' + req.url));
});
server.listen(8080);

显然,这将映射http://localhost:8080/index.htmlproject_dir/public/index.html,对于所有其他文件也是如此。

我的一个担忧是有人可能会滥用它来访问project_dir/public. 像这样的东西,例如:

http://localhost:8080/../../sensitive_file.txt

我尝试了一点,但它不起作用。但是,似乎我的浏览器正在删除“..”本身。这让我相信有人会滥用我可怜的 node.js 服务器。

我知道有做静态文件服务的 npm 包。但我真的很想在这里写我自己的。所以我的问题是:

  1. 这安全吗?

  2. 如果是这样,为什么?如果不是,为什么不呢?

  3. 而且,如果进一步,如果不是,那么“正确”的方法是什么?我的一个限制是我不想为每个可能的文件都有一个 if 子句,我希望服务器为我放入目录中的任何文件提供服务。

4

2 回答 2

0
  1. 不,这不安全。
  2. 因为你提到的原因。
  3. 使用fs.realpath()orfs.realpathSync()并检查规范化路径是否指向您想要的位置。
于 2012-06-03T21:07:09.160 回答
-3

这是不安全的,所以使用类似的东西:

if (req.url.indexOf('..') !== -1) {
    res.writeHead(404);
    res.end();
}

PS:顺便说一句,使用 readFile 而不是 readFileSync 并注意错误...即使是示例,您的实现也太糟糕了-_-

于 2012-06-01T17:30:53.697 回答