Nodejs:通过express param检索文件是否安全?

时间:2018-05-17 14:38:23

标签: node.js express code-injection

下面的代码是安全的还是我需要保护参数不被注入?是否可以访问/content/includes以外的文件?

app.get('/api/includes/:slug', (req, res) => {
  const file = __dirname + '/content/includes/' + req.params.slug + '.html';
  if (fs.existsSync(file)) res.sendFile(file);
  else res.sendStatus(404);
});

1 个答案:

答案 0 :(得分:3)

只需将/content/includes添加到slug路径,就可以访问../之外的文件。您可以使用path.normalize遍历路径并删除所有../,但这仍然会为您提供一条可以在目标目录之外的路径,因此您可以使用path.join来确保目标目录位于预期路径的开头。

// remove all `../` from the start of the slug.
const relativeSlug = req.params.slug.replace(/^(\.\.\/)+/, '');
// normalize the path
const normalizedSlug = path.normalize(relativeSlug);
const file = path.join(__dirname + '/content/includes/', normalizedSlug);

这将有助于确保slug路径位于您的目标目录下。

运行服务器的进程也应该具有对文件系统的有限访问权限,并且无法从其他目录开始阅读。

点击此处了解详情:https://www.owasp.org/index.php/Path_Traversal