Ответ вслух Middle SSRF, файлы и редиректы обновлено

Кейс: отдача файлов по имени

Вопрос

В сервисе документов есть эндпоинт /download?file=имя. Как сделать его безопасным?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «Две угрозы: path traversal через ../ и доступ к чужим документам. Лучше уйти от имён: документ хранится в объектном хранилище под UUID, в базе связь с владельцем и исходное имя.

Что должно прозвучать в ответе

  • Риск: path traversal и чтение чужих файлов

  • Хранить файлы под сгенерированными id, имя от пользователя только для отображения

  • Проверять права пользователя на конкретный документ

  • Если путь неизбежен: нормализация и проверка вхождения в базовую папку

  • Отдавать с attachment, nosniff и правильным типом, лучше через подписанные ссылки хранилища

Что могут спросить следом

  • Чем опасна проверка через startswith?
  • Как быть с символическими ссылками?

Разбор

Образцовый ответ: «Две угрозы: path traversal через ../ и доступ к чужим документам. Лучше уйти от имён: документ хранится в объектном хранилище под UUID, в базе связь с владельцем и исходное имя. Эндпоинт принимает id, проверяет, что пользователь имеет право на документ, и выдаёт короткоживущую подписанную ссылку. Если работаем с локальной папкой, то нормализую путь через realpath, который заодно раскрывает символические ссылки, и проверяю commonpath с базовой папкой, а не startswith. Отдаю с Content-Disposition: attachment и nosniff, чтобы загруженный HTML не открылся как страница».

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

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