Кейс: отдача файлов по имени
Вопрос
В сервисе документов есть эндпоинт /download?file=имя. Как сделать его безопасным?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Риск: path traversal и чтение чужих файлов
Хранить файлы под сгенерированными id, имя от пользователя только для отображения
Проверять права пользователя на конкретный документ
Если путь неизбежен: нормализация и проверка вхождения в базовую папку
Отдавать с attachment, nosniff и правильным типом, лучше через подписанные ссылки хранилища
Что могут спросить следом
- Чем опасна проверка через startswith?
- Как быть с символическими ссылками?
Разбор
Образцовый ответ: «Две угрозы: path traversal через ../ и доступ к чужим документам. Лучше уйти от имён: документ хранится в объектном хранилище под UUID, в базе связь с владельцем и исходное имя. Эндпоинт принимает id, проверяет, что пользователь имеет право на документ, и выдаёт короткоживущую подписанную ссылку. Если работаем с локальной папкой, то нормализую путь через realpath, который заодно раскрывает символические ссылки, и проверяю commonpath с базовой папкой, а не startswith. Отдаю с Content-Disposition: attachment и nosniff, чтобы загруженный HTML не открылся как страница».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.