Как проверить имена файлов из HTTP-запроса в 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('../') — это лишь частичное решение.

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

ouroboring 12.12.2020 19:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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
    }
}

Другие вопросы по теме