Как проверить имена файлов из HTTP-запроса в Node.js ?

#javascript #node.js #security

#javascript #node.js #Безопасность

Вопрос:

У меня есть node.js приложение, предоставляющее API для удаления изображений из каталога ресурсов.

Таким образом, пользователь может выполнить DELETE запрос и отправить указанное изображение на удаление, вот как оно обрабатывается в настоящее время:

 const assetsPath = '/assets'

deleteFile(file: string) {
  fs.unlink(`${assetsPath}/${file}`, (err) => {})
}
 

Проблема в том, что пользователь может отправить запрос следующим образом:
http://server.com?fileName=../../some_personal_file.exe
и это приведет к удалению файла за пределами каталога активов

Как я могу это предотвратить? Я думаю, проверка fileName.includes('../') — это лишь частичное решение

Комментарии:

1. Этот вектор атаки обычно называется обходом каталога / пути, узел публикует информацию о том, как смягчить это: nodejs.org/en/knowledge/file-system/security/introduction /…

Ответ №1:

Node.js опубликовали информацию о том, как смягчить эту атаку (называемую Обходом пути).

Исходя из этой рекомендации, вы можете использовать path модуль для обеспечения безопасности этой операции, например:

 const path = require('path');
const assetsPath = '/assets';

deleteFile(file: string) {
    let deletePath = path.join(assetsPath, file);
    if (deletePath.indexOf(assetsPath) === 0) {
        fs.unlink(deletePath, err => {});
    } else {
        // Display an error to the user somehow
    }
}