intermediate
Input validation security
Считайте external input hostile и валидируйте size, type, shape, encoding, auth context и downstream constraints.
Валидация с точки зрения безопасности считает ввод враждебным — байты от клиентов, webhook, очередей и админок могут быть злонамеренными. Проверка формы не останавливает injection и злоупотребление логикой.
Помимо типов:
- Лимиты размера (body, headers, upload, длина массива)
- Нормализация кодировок (Unicode homoglyphs, overlong UTF-8)
- Allowlist вместо blocklist для enum и типов файлов
- Параметризованные запросы — не конкатенация SQL
- Path traversal в именах файлов
- SSRF при fetch URL от пользователя
- Ключи prototype pollution (`__proto__`, `constructor`)
const Filename = z.string().max(128).regex(/^[a-zA-Z0-9._-]+$/);
const safePath = path.join(uploadDir, path.basename(parsed.data.name));
Валидируйте в контексте identity — ID пользователя A в path должен совпадать с сессией, если нет admin.
На интервью: отличие от бизнес-валидации; схема + authorization; лимиты в духе OWASP.
Типовые ошибки: regex для email/HTML; доверие «внутренней» сети; mass assignment `req.body` в ORM.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Лимиты на proxy и в приложении.
- Allowlist enum и MIME.
- Экранирование вывода по контексту.
- Security-тесты на граничные payload.