gpt4 book ai didi

javascript - 安全 path.resolve 无需从父级逃脱

转载 作者:行者123 更新时间:2023-11-30 16:00:24 24 4
gpt4 key购买 nike

我正在编写一个 (expressjs) http 服务,它在每次调用时获取一个相对路径作为用户输入,根据该路径从文件系统读取一个文件,并对其进行处理,例如:

app.get("/api", (req, res, next) => {
var filePath = path.resolve("./datasource", req.query.path);
fs.readFile(filePath, "utf8", (err, data) => {
processData(data, (err, processed) => {
res.json(processed);
});
});
});

为了清楚起见,我删除了错误处理。问题是可以调用 url /api?path=../../../etc/passwd,这会从服务器本身泄漏信息。我希望此 api 不处理 ./datasource 文件夹之外的文件。我想我可以使用 path.resolve 的一些自定义实现,它不会逃避父级,但在我看来 path 模块中没有这样的功能。我想到的一些例子:

saferesolve("./datasource", "a/b") === "./datasource/a/b"
saferesolve("./datasource", "a/b/../c") === "./datasource/a/c"
saferesolve("./datasource", "../..") === "./datasource"
saferesolve("./datasource", "../../a/b") === "./datasource/a/b"
saferesolve("./datasource", "../../a/b/..") === "./datasource/a"

有什么想法可以在不重新发明整个 path 模块的情况下实现这一目标吗?

最佳答案

这似乎通过了你的测试:

function saferesolve(base, target) {
var targetPath = '.' + path.posix.normalize('/' + target)
return path.posix.resolve(base, targetPath)
}

关于javascript - 安全 path.resolve 无需从父级逃脱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37862886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com