Выбор ответа Middle Безопасность бэкенда обновлено
Path traversal
Вопрос
Что вернёт path.join("/srv/uploads", name) при name = "../../etc/passwd" на Linux, и что делать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: /etc/passwd; проверять, что path.resolve внутри базовой папки. path.join нормализует путь и честно поднимается по .., получается /etc/passwd.
Варианты ответа
/srv/uploads/../../etc/passwd, и файл с таким путём просто не откроется/etc/passwd; проверять, чтоpath.resolveвнутри базовой папкиправильный ответ- Node бросит ошибку
ERR_INVALID_PATHна.. /srv/uploads/etc/passwd: join отбрасывает..из имени
Разбор
path.join нормализует путь и честно поднимается по .., получается /etc/passwd. Это path traversal. Защита: вычислить абсолютный путь и проверить, что он внутри разрешённой папки, а ещё лучше не использовать пользовательское имя как путь вовсе.
- join нормализует
.., а не оставляет его. - Ошибки нет, это валидный путь.
..не отбрасывается, а исполняется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API