4 KiB
4 KiB
Task 05: Auth & CSRF на POST /api/posts/preview Report
Date: 2026-08-21
Base Commit SHA: 4b8c6b10395452a3fd1ff7ea4eb919289b66f33f
Status: COMPLETED / PASS
Assigned Agent: Antigravity (Implementation Orchestrator)
1. Executive Summary
Устранены уязвимости безопасности на маршруте POST /api/posts/preview:
- CSRF Guard (
validateCsrfOrigin): Защищает маршрут от Cross-Site Request Forgery атак. Кросс-сайтовые запросы с чужих доменов (Origin,Referer,Sec-Fetch-Site: cross-site) немедленно отвергаются со статусом403 Forbidden. - Политика доступа и защита от Open Proxy:
- Аутентифицированные организаторы используют изолированный лимитер
post-preview:user:${sessionUser.id}и передаютorganizerIdдля безопасного зондирования закрытых постов. - Анонимные запросы ограничены строгим лимитером
expensiveApiRateLimiter(post-preview:anon:${clientIp}— 15 запросов / 10 с), что полностью блокирует вектор исчерпания серверной квоты VK API и предотвращает использование эндпоинта как открытого прокси.
- Аутентифицированные организаторы используют изолированный лимитер
- Сохранение правдивости Effective Capabilities:
resolveEffectiveCapabilitiesпо-прежнему рассчитывается исключительно от фактически использованного типа авторизацииpost.resolvedAuthType(инвариант Phase 2.3.1). - UI Обработка Ошибок: В
handleFetchPost(src/app/giveaways/new/page.tsx) добавлена понятная обработка401 Unauthorizedс предложением авторизоваться через VK ID.
2. Modified Files
| File | Type | Description |
|---|---|---|
src/app/api/posts/preview/route.ts |
API Route | Добавлена валидация validateCsrfOrigin(req) и строгий лимитер expensiveApiRateLimiter для анонимов. |
src/app/giveaways/new/page.tsx |
UI | Улучшена обработка ошибок 401 в handleFetchPost. |
tests/post-preview-guard.test.ts |
Tests (NEW) | Набор тестов (5 тестов) на CSRF, Sec-Fetch-Site, строгий анонимный лимит, capabilities и отсутствие утечки VK_SERVICE_TOKEN. |
tests/rate-limit-identity.test.ts |
Tests | Обновлены тесты изоляции пользовательских лимитов и валидации IP через TRUST_PROXY=true. |
3. Architecture & Security Invariants
- Zero Token Leakage: Серверный
VK_SERVICE_TOKENи приватные организаторские токены ни при каких обстоятельствах не попадают в тело ответа. - Fail-Closed CSRF: Любой запрос с несовпадающим
Originблокируется до вызова VK API. - Quota Protection: Невозможно истощить квоту приложения анонимными запросами благодаря строгому ограничению IP.
4. Verification Evidence & Test Gate
npx prisma generate -> EXIT 0 (Prisma Client v5.22.0)
npx tsc --noEmit -> EXIT 0 (0 ошибок типизации)
npm test -> EXIT 0 (53 тестовых файла, 311 тестов прошли успешно)
npm run lint -> EXIT 0 (0 ошибок, 6 warnings на no-img-element)
npm run build -> EXIT 0 (Все 16 маршрутов скомпилированы успешно)
npm audit --omit=dev -> EXIT 0 (0 vulnerabilities)