У меня есть приложение 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('../')
— это лишь частичное решение.
Node.js опубликовали информацию о том, как смягчить эту атаку (называемую Path Traversal).
Взяв из этого совета, вы можете использовать модуль 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
}
}
Этот вектор атаки обычно называют обходом каталога/пути. Node публикует информацию о том, как смягчить это: nodejs.org/en/knowledge/file-system/security/introduction/…