Код 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
  1. Нормализуй путь сам через стек сегментов.
  2. Выход за root: попытка .., когда в стеке остались только сегменты root.
  3. Проверка startsWith(root) без разделителя пропустит /srv/files2.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.