Nodejs: Безопасно ли извлекать файл по экспресс-параметру? - PullRequest
0 голосов
/ 17 мая 2018

Безопасен ли приведенный ниже код или мне нужно защитить параметр от инъекций? Можно ли получить доступ к файлу за пределами /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 голосов
/ 17 мая 2018

Определенно возможно получить доступ к файлам за пределами /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);

Это поможет убедиться, что путь к слагу находится в вашем намеченном каталоге.

Процесс, выполняющий ваш сервер, должен также иметь ограниченный доступ к файловой системе, а небыть в состоянии прочитать много из других каталогов для начала.

Подробнее об этом здесь: https://www.owasp.org/index.php/Path_Traversal

...