Выбор ответа Middle Безопасность бэкенда обновлено

Path traversal

Вопрос

Что вернёт path.join("/srv/uploads", name) при name = "../../etc/passwd" на Linux, и что делать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: /etc/passwd; проверять, что path.resolve внутри базовой папки. path.join нормализует путь и честно поднимается по .., получается /etc/passwd.

Варианты ответа

  1. /srv/uploads/../../etc/passwd, и файл с таким путём просто не откроется
  2. /etc/passwd; проверять, что path.resolve внутри базовой папкиправильный ответ
  3. Node бросит ошибку ERR_INVALID_PATH на ..
  4. /srv/uploads/etc/passwd: join отбрасывает .. из имени

Разбор

path.join нормализует путь и честно поднимается по .., получается /etc/passwd. Это path traversal. Защита: вычислить абсолютный путь и проверить, что он внутри разрешённой папки, а ещё лучше не использовать пользовательское имя как путь вовсе.

  • join нормализует .., а не оставляет его.
  • Ошибки нет, это валидный путь.
  • .. не отбрасывается, а исполняется.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме