FixVibe

// docs / security guides / cursor checklist

Cursor security checklist: 25 items before ship

Building with Cursor? Cursor's autocomplete and Agent features are exceptionally powerful — and create predictable security blind spots. This checklist targets Cursor-specific patterns: service-role key inlining, generated multi-file edits merged without review, Agent-mode terminal commands, and project rules (.cursor/rules) as your first security guardrail. 25 items across secrets, database, auth, headers, deployment, and Cursor-specific gotchas.

PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.

Секреты и ключи API (5 шт.)

Автозаполнение Cursor обучено на открытом исходном коде, где секреты являются общими. Модель предлагает их свободно, особенно после неудачной попытки авторизации.

  1. PRE — Write security rules into your project rules. Add a rule in .cursor/rules (Cursor docs): "Never inline SUPABASE_SERVICE_ROLE_KEY, sk_live_*, or any server secret into client-side code. Always use server-only imports." Cursor applies project rules as context for Agent and chat.
  2. PRE — Audit Composer-generated files. Когда Composer Cursor создаст целый файл (особенно обработчики аутентификации), просмотрите его построчно. Composer иногда встраивает переменные env, которые должны оставаться только на сервере. Ищите NEXT_PUBLIC_ или прямые ссылки на служебные ключи в импорте компонентов.
  3. PRE — Reject auto-imports of service clients into client components. Если Composer импортирует import { supabase } from '@/lib/supabase/service' в файл React, немедленно удалите его и направьте вместо этого через конечную точку API. Импорт только для сервера помечен явно — не пропускайте его.
  4. PRE — Scan Agent-mode commits. В режиме агента выполняются команды терминала и возможна непосредственная фиксация. Проведите аудит git log --oneline -20 и git diff HEAD~5, чтобы убедиться, что во время работы агента не было зафиксировано никаких секретных строк.
  5. POST — Run Secrets in JavaScript Bundles. Пассивная проверка развернутого URL. Если в пакете JS появится служебный ключ, немедленно поверните его — вероятно, автозаполнение Cursor встроило его.

Контроль доступа к базе данных (4 шт.)

Composer часто генерирует рабочий код авторизации, но пропускает RLS — момент «это работает» не позволяет людям заметить отсутствие применения политики.

  1. PRE — Make Cursor generate migrations with RLS. In your project rules: "Every CREATE TABLE public.* migration must include ALTER TABLE ... ENABLE ROW LEVEL SECURITY and a policy per command scoped to auth.uid()." Then ask Cursor to generate the migration.
  2. PRE — Review Composer-generated policies. Composer иногда пишет политики без проверки auth.uid(). Такие политики, как allow select on public.items без пункта using, опасно широки. Требуйте соответствия user_id.
  3. DEPLOY — Confirm RLS and policies are live. Open Supabase Studio and check that every table's RLS toggle is on and that each table has policies. A table with RLS on and no policies denies everything; one with USING (true) allows everyone.
  4. POST — Run a FixVibe scan on the deployed app. Check the Supabase Row-Level Security result: it shows any table an anonymous visitor can read with your public key.

Аутентификация и сеансы (4 шт.)

Cursor быстро генерирует потоки аутентификации, но часто упускает из виду тонкую проверку на стороне сервера, которая обеспечивает безопасность токенов.

  1. PRE — Ensure all auth routes use getUser(). Найдите getSession() в маршрутах API и замените на await supabase.auth.getUser(). getSession() считывает непроверенный файл cookie; getUser() проверяет с помощью Supabase бэкенд.
  2. PRE — Check Composer auth handlers for token expiry. Для токенов Magic-link необходима поддержка expires_at на сервере. По умолчанию Supabase составляет 1 час — не просите Cursor отменить его без реальной причины.
  3. PRE — Audit the sign-in redirect guard. Перенаправление параметра запроса next после входа в систему должно быть проверено: должно начинаться с /, а не //. Композитор иногда пропускает это. Добавьте его вручную, если он отсутствует.
  4. POST — Test logout server-side state destruction. Войдите, выйдите из системы, проверьте файлы cookie (Инструменты разработчика → Приложение → Файлы cookie). Файл cookie сеанса должен быть немедленно удален. Если оно сохраняется, обработчик выхода из системы не уничтожает состояние.

HTTP заголовки безопасности и CSP (3 элемента)

Cursor по умолчанию редко генерирует промежуточное программное обеспечение. Если вы не спросите явно, CSP и HSTS обычно там нет.

  1. PRE — Demand CSP in your project rules. Add: "Generate a src/middleware.ts with Content-Security-Policy. Use nonce for script-src, no unsafe-inline." Then ask Cursor to generate it. Without this hint, middleware is skipped.
  2. PRE — Verify src/middleware.ts exists. При структуре каталога src/ Next.js получает только src/middleware.ts. Корневой уровень middleware.ts игнорируется. Если CSP не приземляется, убедитесь, что файл находится в правильном месте.
  3. POST — Run HTTP Security Headers. В отчетах о пассивном сканировании отсутствуют CSP, HSTS, X-Frame-Options, X-Content-Type-Options. Откройте отчет и следуйте инструкциям по исправлению для вашей платформы развертывания.

Гигиена развертывания (5 пунктов)

Приложения Cursor часто попадают на Vercel, который имеет хорошие настройки по умолчанию, но требует явного усиления границы build/deploy.

  1. DEPLOY — Check Vercel env-var scoping. Настройки → Переменные среды → каждый секрет должен быть ограничен только Production. Никогда не делитесь sk_live_* с предварительной версией или разработкой.
  2. DEPLOY — Disable build-log secret echo. Если ваш рабочий процесс действий vercel.json или GitHub имеет echo $SECRET, удалите его. Журналы сборки архивируются публично; секреты в журналах скомпрометированы.
  3. DEPLOY — Use Vercel's managed secrets, not inline workflow vars. Vercel Настройки → Переменные среды шифруются в неактивном состоянии. GitHub Секреты действий лучше, чем ничего, но они предназначены для CI, а не для интеграции платформы развертывания.
  4. POST — Verify CSP nonce on the deployed preview. Откройте ссылку Vercel предварительного просмотра в браузере, откройте DevTools → Сеть → корневой ответ HTML. Заголовок CSP должен присутствовать и включать 'strict-dynamic' с уникальным одноразовым номером для каждого запроса.
  5. POST — Rotate any key that ever shipped, even to Preview. Если ключ попал в производственный комплект хотя бы за 10 минут, он скомпрометирован. Немедленно поверните.

Cursor-специфичные ошибки (4 пункта)

Шаблоны, уникальные для рабочего процесса Cursor, которые создают угрозы безопасности:

  1. Agent mode auto-fixes propagate old patterns. Если вы попросите агента «исправить ошибки аутентификации», он может повторно создать один и тот же файл аутентификации несколько раз, каждый раз встраивая один и тот же служебный ключ, если он находится в контексте кодовой базы. Сначала очистите оригинал, а затем попросите агента исправить его.
  2. Индексирование Cursor Index leaks intent. Cursor @codebase является мощным инструментом, но если ваш каталог .cursor когда-либо будет раскрыт (неправильно настроен S3, история git), индекс покажет вашу архитектуру и секретные шаблоны. Держите .cursor локальным.
  3. Composer mode loses context between files. Каждый файл, создаваемый Composer, является свежим. Если вы попросите его сгенерировать файл клиента, а затем маршрут API, они могут использовать разные конфигурации клиента Supabase. Просмотрите оба и убедитесь, что они соответствуют вашей архитектуре.
  4. Autocomplete bias toward "working" over "secure". Cursor предлагает самый быстрый код, который передает ваш текущий контекст. Если в вашем тесте есть NEXT_PUBLIC_SERVICE_KEY, автозаполнение запоминает его и предлагает повторно. Очистите тестовые приспособления, прежде чем делиться кодом с моделью.

Следующие шаги

После того как вы зафиксировали шаблоны, специфичные для Cursor, перекрестно проверьте general vibe coding security checklist (51 элемента), а затем step-by-step hardening. Также смотрите Claude Code checklist, если вы смешиваете инструменты.

// scan your app

Хватит читать. Найдите бреши в своём приложении.

Drop in a URL — FixVibe runs every passive check from this guide plus the rest of its 230+ passive checks, usually in under a minute. Free, no install, no card.

  • Free уровень — 3 скана/месяц, без карты.
  • Пассивное сканирование любых URL — проверка домена не требуется.
  • Настроен на Cursor, Claude Code, Lovable, Bolt, v0, Replit.
  • Coding-agent prompts for code/config findings, plus operator steps for DNS/provider fixes.
Cursor security checklist: 25 items before ship · FixVibe