Expressjs的" express.static() ";默认情况下防止目录/路径遍历,但我认为Nodejs默认情况下对目录/路径遍历没有任何保护??最近尝试学习一些web开发安全(目录/路径遍历),我创建了这个:
const http = require("http");
const fs = require("fs");
http
.createServer(function (req, res) {
if (req.url === "/") {
fs.readFile("./public/index.html", "UTF-8", function (err, data) {
if (err) throw err;
res.writeHead(200, { "Content-Type": "text/html" });
res.end(data);
});
} else {
if (req.url === "/favicon.ico") {
res.writeHead(200, { "Content-Type": "image/ico" });
res.end("404 file not found");
} else {
fs.readFile(req.url, "utf8", function (err, data) {
if (err) throw err;
res.writeHead(200, { "Content-Type": "text/plain" });
res.end(data);
});
}
}
})
.listen(3000);
console.log("The server is running on port 3000");
模拟目录/路径遍历安全漏洞,但我试图使用"../../../secret.txt"当我检查" request .url",它显示"/secret.txt"而不是"…/…/…/secret.txt"我也试过使用"%2e","%2f",它仍然不工作,我仍然无法获得"secret.txt">
(My folder Structure)
- node_modules
- public
- css
- style.css
- images
- dog.jpeg
- js
- script.js
index.html
- package.json
- README.md
- server.js
- secret.txt
根据express的文档。static[1],它指向server -static模块[2]的文档,您提供的目录是根目录目录,这意味着它被故意设置为无法访问它之外的任何内容。
要提供静态文件,如图像、CSS文件和JavaScript文件,请使用express。Express.
函数签名为:
表达。静态(根,[选项])
root参数指定要提供静态资产的根目录。有关options参数的更多信息,请参见express.static。[3]
[1] https://expressjs.com/en/starter/static-files.html
[2] https://expressjs.com/en/resources/middleware/serve-static.html API[3] https://expressjs.com/en/4x/api.html express.static
不相关,但供参考:您提供给fs
等的路径是相对于从哪里调用脚本。
例如,如果你从应用程序的根文件夹调用node server.js
,路径"./public/index.html"
应该工作正常,但如果你从不同的路径调用它,它将失败,例如node /home/user/projects/this-project/server.js
。
__dirname
连接路径,如下所示:
+const path = require("path");
-fs.readFile("./public/index.html", "UTF-8", function (err, data) {
+fs.readFile(path.join(__dirname, "./public/index.html"), "UTF-8", function (err, data) {
}
这使得路径相对于您试图从中访问的当前文件的目录,这是您所期望的。