advanced
Input validation, output encoding и file upload security
Validate untrusted input на boundaries, encode output под контекст и изолируйте uploads через type checks, size limits, scanning и private storage.
Валидируйте на trust boundaries: HTTP body, query, headers, webhooks, uploads. Schema validators (Zod, Joi, TypeBox) и отклонение unknown fields — fail closed.
import { z } from 'zod';
const CreateUser = z.object({
email: z.string().email().max(320),
name: z.string().min(1).max(120),
}).strict();
const input = CreateUser.parse(req.body);
Output encoding по контексту — HTML, attribute, URL, JS string. Validation не заменяет encoding на выходе.
File uploads: лимиты размера, allowlist MIME по magic bytes (не только extension), хранение вне web root, случайные object keys, antivirus/async scan, раздача signed URLs, не прямые пути.
На интервью: allowlist vs blocklist; `multipart` и streaming limits в Node; path traversal в архивах.
Типовые ошибки: доверие client `Content-Type`; uploads из `/public`; SVG со script.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Schema validation на каждый внешний input.
- Encode на output по sink.
- Private storage + signed download URLs.
- Stream uploads с backpressure и size caps.