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.