randomayzer/agents/antigravity/done/TASK-2026-08-21-05-post-preview-auth.md

4 KiB
Raw Blame History

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:

  1. CSRF Guard (validateCsrfOrigin): Защищает маршрут от Cross-Site Request Forgery атак. Кросс-сайтовые запросы с чужих доменов (Origin, Referer, Sec-Fetch-Site: cross-site) немедленно отвергаются со статусом 403 Forbidden.
  2. Политика доступа и защита от Open Proxy:
    • Аутентифицированные организаторы используют изолированный лимитер post-preview:user:${sessionUser.id} и передают organizerId для безопасного зондирования закрытых постов.
    • Анонимные запросы ограничены строгим лимитером expensiveApiRateLimiter (post-preview:anon:${clientIp} — 15 запросов / 10 с), что полностью блокирует вектор исчерпания серверной квоты VK API и предотвращает использование эндпоинта как открытого прокси.
  3. Сохранение правдивости Effective Capabilities: resolveEffectiveCapabilities по-прежнему рассчитывается исключительно от фактически использованного типа авторизации post.resolvedAuthType (инвариант Phase 2.3.1).
  4. 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)