Как проверить, что файлы, соответствующие правилу, отправляются на сервер
Что проверяют
Умеете ли вы разложить правило на классы эквивалентности и проверить результат на всех уровнях: в интерфейсе, в сетевом запросе и на сервере. Главное, что хотят услышать: подходящие файлы доходят целыми, а неподходящие не уходят и не принимаются сервером. Следом спрашивают, как убедиться, что запрещённый файл нельзя загрузить в обход клиента.
Как отвечать
Начните с разбора правила. Обычно это расширения или MIME-типы, лимит размера, маска имени или папка для синхронизации. Под него строится набор данных:
- граничные значения размера: 0 байт, ровно лимит, лимит плюс один байт;
- расширения: разрешённое в разном регистре (
.jpgи.JPG), двойноеphoto.jpg.exe, файл без расширения; - подмена содержимого: исполняемый файл, переименованный в
.png. Сервер должен проверять сигнатуру файла, а не доверять имени и заголовкуContent-Type; - имена: кириллица, пробелы, очень длинное имя, спецсимволы;
- для масок и папок: вложенные каталоги, скрытые файлы, символические ссылки, неподходящий файл рядом с подходящими.
Затем проверка на трёх уровнях:
- сеть: в DevTools или через прокси (Charles, Fiddler, mitmproxy) видно запрос
multipart/form-data, имя файла вContent-Dispositionи число запросов. Для неподходящего файла запроса быть не должно; - сервер напрямую: отправьте запрещённый файл в обход интерфейса через Postman или
curl -F. Правильный ответ: ошибка вроде413за размер или415за тип, а не200; - хранилище: файл действительно лежит в хранилище и в базе, а контрольная сумма SHA-256 совпадает с исходной, то есть файл не обрезался при передаче.
В автотестах это делается через Playwright (setInputFiles плюс ожидание запроса) или через pytest и requests с параметром files для API.
Где спотыкаются
Доверяют проверке на клиенте. Её обходит любой, кто отправит запрос напрямую, поэтому серверную валидацию проверяют отдельно.
Смотрят на сообщение «Файл загружен» и не проверяют, что файл реально сохранился и побайтно совпадает с исходным.
Ограничиваются одним подходящим и одним неподходящим файлом, без границ размера, регистра расширений и подмены содержимого.