// 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 обучено на открытом исходном коде, где секреты являются общими. Модель предлагает их свободно, особенно после неудачной попытки авторизации.
- PRE — Write security rules into your project rules. Add a rule in
.cursor/rules(Cursor docs): "Never inlineSUPABASE_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. - PRE — Audit Composer-generated files. Когда Composer Cursor создаст целый файл (особенно обработчики аутентификации), просмотрите его построчно. Composer иногда встраивает переменные env, которые должны оставаться только на сервере. Ищите
NEXT_PUBLIC_или прямые ссылки на служебные ключи в импорте компонентов. - PRE — Reject auto-imports of service clients into client components. Если Composer импортирует
import { supabase } from '@/lib/supabase/service'в файл React, немедленно удалите его и направьте вместо этого через конечную точку API. Импорт только для сервера помечен явно — не пропускайте его. - PRE — Scan Agent-mode commits. В режиме агента выполняются команды терминала и возможна непосредственная фиксация. Проведите аудит
git log --oneline -20иgit diff HEAD~5, чтобы убедиться, что во время работы агента не было зафиксировано никаких секретных строк. - POST — Run Secrets in JavaScript Bundles. Пассивная проверка развернутого URL. Если в пакете JS появится служебный ключ, немедленно поверните его — вероятно, автозаполнение Cursor встроило его.
Контроль доступа к базе данных (4 шт.)
Composer часто генерирует рабочий код авторизации, но пропускает RLS — момент «это работает» не позволяет людям заметить отсутствие применения политики.
- PRE — Make Cursor generate migrations with RLS. In your project rules: "Every
CREATE TABLE public.*migration must includeALTER TABLE ... ENABLE ROW LEVEL SECURITYand a policy per command scoped toauth.uid()." Then ask Cursor to generate the migration. - PRE — Review Composer-generated policies. Composer иногда пишет политики без проверки
auth.uid(). Такие политики, какallow select on public.itemsбез пунктаusing, опасно широки. Требуйте соответствия user_id. - 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. - 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 быстро генерирует потоки аутентификации, но часто упускает из виду тонкую проверку на стороне сервера, которая обеспечивает безопасность токенов.
- PRE — Ensure all auth routes use
getUser(). НайдитеgetSession()в маршрутах API и замените наawait supabase.auth.getUser().getSession()считывает непроверенный файл cookie;getUser()проверяет с помощью Supabase бэкенд. - PRE — Check Composer auth handlers for token expiry. Для токенов Magic-link необходима поддержка
expires_atна сервере. По умолчанию Supabase составляет 1 час — не просите Cursor отменить его без реальной причины. - PRE — Audit the sign-in redirect guard. Перенаправление параметра запроса
nextпосле входа в систему должно быть проверено: должно начинаться с/, а не//. Композитор иногда пропускает это. Добавьте его вручную, если он отсутствует. - POST — Test logout server-side state destruction. Войдите, выйдите из системы, проверьте файлы cookie (Инструменты разработчика → Приложение → Файлы cookie). Файл cookie сеанса должен быть немедленно удален. Если оно сохраняется, обработчик выхода из системы не уничтожает состояние.
HTTP заголовки безопасности и CSP (3 элемента)
Cursor по умолчанию редко генерирует промежуточное программное обеспечение. Если вы не спросите явно, CSP и HSTS обычно там нет.
- PRE — Demand CSP in your project rules. Add: "Generate a
src/middleware.tswith Content-Security-Policy. Use nonce for script-src, no unsafe-inline." Then ask Cursor to generate it. Without this hint, middleware is skipped. - PRE — Verify
src/middleware.tsexists. При структуре каталогаsrc/Next.js получает толькоsrc/middleware.ts. Корневой уровеньmiddleware.tsигнорируется. Если CSP не приземляется, убедитесь, что файл находится в правильном месте. - POST — Run HTTP Security Headers. В отчетах о пассивном сканировании отсутствуют CSP, HSTS, X-Frame-Options, X-Content-Type-Options. Откройте отчет и следуйте инструкциям по исправлению для вашей платформы развертывания.
Гигиена развертывания (5 пунктов)
Приложения Cursor часто попадают на Vercel, который имеет хорошие настройки по умолчанию, но требует явного усиления границы build/deploy.
- DEPLOY — Check Vercel env-var scoping. Настройки → Переменные среды → каждый секрет должен быть ограничен только Production. Никогда не делитесь
sk_live_*с предварительной версией или разработкой. - DEPLOY — Disable build-log secret echo. Если ваш рабочий процесс действий
vercel.jsonили GitHub имеетecho $SECRET, удалите его. Журналы сборки архивируются публично; секреты в журналах скомпрометированы. - DEPLOY — Use Vercel's managed secrets, not inline workflow vars. Vercel Настройки → Переменные среды шифруются в неактивном состоянии. GitHub Секреты действий лучше, чем ничего, но они предназначены для CI, а не для интеграции платформы развертывания.
- POST — Verify CSP nonce on the deployed preview. Откройте ссылку Vercel предварительного просмотра в браузере, откройте DevTools → Сеть → корневой ответ HTML. Заголовок CSP должен присутствовать и включать
'strict-dynamic'с уникальным одноразовым номером для каждого запроса. - POST — Rotate any key that ever shipped, even to Preview. Если ключ попал в производственный комплект хотя бы за 10 минут, он скомпрометирован. Немедленно поверните.
Cursor-специфичные ошибки (4 пункта)
Шаблоны, уникальные для рабочего процесса Cursor, которые создают угрозы безопасности:
- Agent mode auto-fixes propagate old patterns. Если вы попросите агента «исправить ошибки аутентификации», он может повторно создать один и тот же файл аутентификации несколько раз, каждый раз встраивая один и тот же служебный ключ, если он находится в контексте кодовой базы. Сначала очистите оригинал, а затем попросите агента исправить его.
- Индексирование Cursor Index leaks intent. Cursor
@codebaseявляется мощным инструментом, но если ваш каталог.cursorкогда-либо будет раскрыт (неправильно настроен S3, история git), индекс покажет вашу архитектуру и секретные шаблоны. Держите.cursorлокальным. - Composer mode loses context between files. Каждый файл, создаваемый Composer, является свежим. Если вы попросите его сгенерировать файл клиента, а затем маршрут API, они могут использовать разные конфигурации клиента Supabase. Просмотрите оба и убедитесь, что они соответствуют вашей архитектуре.
- 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, если вы смешиваете инструменты.
