如何处理路径遍历?

问题描述

我正在尝试了解如何(以安全的方式)处理路径遍历。

例如,应用程序通过 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...
}

上述方法的问题在于,客户端可以在 fileName 请求中发送类似“../”的内容,并且它会毫无问题地“吃掉”它。请问如何处理这种情况,我应该如何以及如何修复此漏洞?

更新: 抱歉,我忘了提及我知道我应该检查收到的输入,但是如果我需要传递“/”和“.”怎么办?在输入中?另外,如果我不需要这个字符,我只需要检查删除路径遍历漏洞吗?

解决方法

一种简单的方法是通过检测任何 ../ 段并返回错误(如果存在)的正则表达式来验证文件名。

if (fileName.match(/\.\.\//g) !== null) {
    // return an api error
}

您可以有一个非常严格的验证规则,以防止 fileName 中出现任何正斜杠,从而只能直接指向所需目录中的文件。