Можно ли загрузить файл?
Что проверяют
Вопрос нарочно расплывчатый. Интервьюер смотрит, начнёте ли вы сразу сыпать кейсами или сначала выясните требования, и насколько далеко проверки уйдут от «файл загрузился». Следом просят назвать самые опасные сценарии или показать загрузку в автотесте.
Как отвечать
Начните с уточнений: какие форматы разрешены, максимальный размер и количество, куда попадает файл и кто его потом увидит. Без этого проверять не с чем. Дальше каркас:
- позитивные: каждый разрешённый формат, файл ровно максимального размера, несколько файлов, кириллица и пробелы в имени, кнопка и перетаскивание, повторная загрузка файла с тем же именем;
- границы и негатив: 0 байт, максимум плюс один байт, запрещённое расширение, обрыв сети посередине, отмена. На слишком большой файл сервер обычно отвечает 413, а интерфейс должен показать понятное сообщение, а не зависшую полоску;
- безопасность:
.exe, переименованный в.jpg, должен ловиться по содержимому, а не по расширению илиContent-Typeот клиента. Сюда же SVG со скриптом, имя файла вида../../config, архив-бомба и картинка с гигантскими размерами; - после загрузки: файл открывается и скачивается в исходном виде, доступен только тем, кому положено, и посторонний не получит его по прямой ссылке.
На уровне API загрузка это multipart/form-data: в Postman поле типа File, в curl -F "file=@photo.jpg". Так быстрее проверить серверные ограничения в обход фронтенда.
В автотестах в системный диалог выбора файла не ходят: в Selenium передают путь через sendKeys в input[type=file], в Playwright вызывают setInputFiles, в Cypress selectFile. Скрытый input в Selenium иногда приходится сначала сделать видимым через JavaScript.
Где спотыкаются
Проверяют ограничения только в интерфейсе. Фронтенд легко обойти прямым запросом, и сервер без своих проверок примет что угодно.
Верят расширению файла. Переименование занимает у атакующего секунду.
Забывают о судьбе файла после загрузки: не проверяют, кто может его открыть и в каком виде он отдаётся обратно.