如何处理路径遍历?

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
}

你可以有一个非常严格的验证规则来阻止文件名中的任何正斜杠,使得它只能直接指向你想要的目录中的文件。