Код Middle Файлы и процессы спрашивают часто обновлено
Защита от path traversal при раздаче файлов
Условие
Сервер отдаёт файлы из каталога root по пути из URL. Напиши safeJoin(root, userPath) (POSIX-пути):
- сначала декодируй
userPathчерезdecodeURIComponent(если декодирование падает, верниnull); - если в пути есть нулевой байт
\0, верниnull; - склей
rootи путь, нормализуй: убери пустые сегменты и., обработай..(подъём на уровень вверх); - если итоговый путь выходит за пределы
root, верниnull, иначе верни нормализованный абсолютный путь без завершающего/.
Ведущий / в userPath означает «от корня раздачи», а не от корня ФС. root абсолютный и уже нормализован.
Примеры
safeJoin("/srv/files", "docs/a.pdf") // "/srv/files/docs/a.pdf"
safeJoin("/srv/files", "/docs/./b.txt") // "/srv/files/docs/b.txt"
safeJoin("/srv/files", "../../etc/passwd") // null
Как подойти
Подсказки: 3
- Нормализуй путь сам через стек сегментов.
- Выход за root: попытка
.., когда в стеке остались только сегменты root. - Проверка
startsWith(root)без разделителя пропустит/srv/files2.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Парсер .env-файла
Следующий вопрос
Код-ревью: конвертация файлов через внешнюю утилиту