如何处理路径遍历?
How to deal with Path Traversal?
我正在尝试了解如何(以安全的方式)处理路径遍历。
例如,应用程序通过 JSON 中的 REST API 从客户端接收文件名,在不可访问的(外部)目录中查找它并检索包含该文件的响应:
app.get('/', (req, res) => {
const fileName = req.body.fileName;
// some code...
fs.stat(`./nonAccessibleDir/${fileName}`, async function(err, stat) {
// some code...
});
// some code...
}
上述方法的问题在于,客户端可以在文件名请求中发送类似“../”的内容,并且它会毫无问题地“吃掉”它。请问遇到这种情况应该怎么处理,我应该怎么修复这个漏洞?
更新:
抱歉,但我忘了说我知道我应该检查收到的输入,但是如果我需要传递“/”和“.”怎么办?在输入?另外,如果我不需要这些字符,我只需要检查一下就可以消除路径遍历漏洞吗?
一种简单的方法是通过正则表达式验证文件名,该正则表达式检测任何 ../
段和 returns 如果存在任何错误。
if (fileName.match(/\.\.\//g) !== null) {
// return an api error
}
你可以有一个非常严格的验证规则来阻止文件名中的任何正斜杠,使得它只能直接指向你想要的目录中的文件。
我正在尝试了解如何(以安全的方式)处理路径遍历。
例如,应用程序通过 JSON 中的 REST API 从客户端接收文件名,在不可访问的(外部)目录中查找它并检索包含该文件的响应:
app.get('/', (req, res) => {
const fileName = req.body.fileName;
// some code...
fs.stat(`./nonAccessibleDir/${fileName}`, async function(err, stat) {
// some code...
});
// some code...
}
上述方法的问题在于,客户端可以在文件名请求中发送类似“../”的内容,并且它会毫无问题地“吃掉”它。请问遇到这种情况应该怎么处理,我应该怎么修复这个漏洞?
更新: 抱歉,但我忘了说我知道我应该检查收到的输入,但是如果我需要传递“/”和“.”怎么办?在输入?另外,如果我不需要这些字符,我只需要检查一下就可以消除路径遍历漏洞吗?
一种简单的方法是通过正则表达式验证文件名,该正则表达式检测任何 ../
段和 returns 如果存在任何错误。
if (fileName.match(/\.\.\//g) !== null) {
// return an api error
}
你可以有一个非常严格的验证规则来阻止文件名中的任何正斜杠,使得它只能直接指向你想要的目录中的文件。