// docs / security guides / pre-ship checklist
Чек-лист безопасности vibe coding: 51 пункта перед запуском
Практичный, поэтапный контрольный список для приложений, созданных с помощью Cursor, Claude Code, Lovable, Bolt, v0, Replit и Windsurf. Каждый пункт можно выполнить менее чем за пять минут. Проходите его перед запуском в производство, а затем еще раз перед каждым крупным выпуском. Элементы сгруппированы в семь категорий — секреты, база данных, аутентификация, заголовки, сторонние, развертывание, мониторинг — и помечены фазой развертывания, к которой они относятся.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
Секреты и ключи API (8 шт.)
Жестко закодированные клавиши — самая распространенная находка в приложениях с Vibe-кодом. Восемь вещей, которые помогут их избежать:
- PRE — Audit
NEXT_PUBLIC_env vars. Все, что имеет префиксNEXT_PUBLIC_, поставляется в составе клиентских пакетов. Если это ключ Supabaseservice_role(декодируется в JWT с"role":"service_role"), удалите его и направьте через серверный клиент (src/lib/supabase/service.tsсimport 'server-only'). - PRE — Grep for hardcoded provider keys. Источник поиска для
sk_live_,pk_live_,STRIPE_SECRET,sk-ant-,sk-,AIza,AKIAи JWT-ищущих строк (eyJ). Переместите каждое попадание в.env.localи используйте ссылку только черезprocess.env.*на стороне сервера. - PRE — Verify
.gitignore. Подтвердите.env*.local,.npmrc,.yarnrc, и все файлы учетных данных, относящиеся к конкретному поставщику, игнорируются. Запуститеgit ls-filesпо шаблонам вашего провайдера, чтобы найти что-нибудь уже зафиксированное. - PRE — Scan the built bundle. Запустите
npm run build, затем grep.next/staticи любые выходные данныеdist/для тех же шаблонов. Если ключ достигает пакета, у разработчика никогда не было четкого разделения окружения. - DEPLOY — Set secrets per environment. Vercel: Настройки → Переменные среды, область действия каждой — Production/Предварительный просмотр/Разработка. Никогда не делитесь
sk_live_*с помощью среды предварительного просмотра. Используйте зашифрованное хранилище env-var Vercel, а не встроенные секреты рабочего процесса. - DEPLOY — Disable build-log secret echo. Некоторые CI конфиги
echoпеременные окружения во время сборки. Проверьте свои рабочие процессыvercel.json, GitHub Actions или Cloudflare Pages на наличие любыхecho $SECRET, которые могут отправить значение в общедоступные журналы сборки. - POST — Run a passive scan. FixVibe Free уровня охватывает это: вставьте развернутый URL, подождите ~20 секунд, найдите результаты
secrets.*. Проверка Secrets in JavaScript Bundles выявляет ключи, которые попали вlocalStorageилиsessionStorageиз-за неправильного использования SDK. - POST — Rotate any key that ever shipped. Если ключ находился в общедоступном пакете хотя бы несколько минут, считайте его скомпрометированным. Ротация ключей сервисной роли Supabase через панель управления, повторное создание ограниченных ключей Stripe, отзыв ключей Anthropic/OpenAI/Google через их консоли.
Контроль доступа к базе данных: правила RLS и Firestore (6 шт.)
BaaS значения по умолчанию намеренно являются разрешающими, поэтому первое руководство работает. Production требует четкой политики.
- PRE — Enable RLS on every
public.*table. In Supabase: each table needsALTER TABLE ... ENABLE ROW LEVEL SECURITYplus explicit policies for each role. RLS is what stops theanonandauthenticatedAPI roles;FORCE ROW LEVEL SECURITYonly extends it to the table owner and is optional defence in depth. - PRE — Write a policy per (table, role, action). Минимум: политика SELECT, которая присоединяется
auth.uid(). Лучше: отдельные политики INSERT / UPDATE / DELETE, чтобы UPDATE не мог переправитьuser_idизменения, которые перенаправляют владельца. - PRE — Replace default Firebase rules. Правила тестового режима по умолчанию читаются как
allow read, write: if true;. Замените правилами с привязкой к аутентификации для каждой коллекции:match /users/{userId}наallow read, write: if request.auth.uid == userId;. - PRE — Lint migrations in CI. Перед слиянием запустите
supabase db lintили его эквивалент. CI должен завершить сборку неудачно, если у какого-либоCREATE TABLE public.*отсутствует соответствующая политика RLS. - DEPLOY — Confirm RLS survived deploy. Повторно проверьте в Supabase Studio после развертывания: Таблицы → каждая строка → переключатель RLS — ON. Production базы данных иногда опережает миграцию файлов политик; убедитесь, что политика активна.
- POST — Run an active scan against a verified domain. Активная проверка Supabase Row-Level Security записывает в крошечную начальную строку с помощью ключа anon и сообщает, если запись прошла успешно — i.e. RLS на самом деле не обеспечивает соблюдения.
Аутентификация и сеансы (7 позиций)
Ошибки аутентификации в приложениях с кодом AI-, как правило, незаметны: ошибка при проверке токена на единицу, пропущенный флаг HttpOnly, getSession() там, где должен быть getUser().
- PRE — Replace
getSession()withgetUser().getSession()читает файл cookie и доверяет ему;getUser()проверяет серверную часть Supabase. На маршрутах сервера всегда используйтеgetUser(). - PRE — Confirm token expiry. Токены Magic-link, токены сброса пароля и проверки электронной почты должны иметь срок действия, определяемый сервером. Срок действия магических ссылок Supabase по умолчанию истекает через 1 час — не заменяйте это значение на большее число без реальной причины.
- PRE — Verify JWT
audandexp. Если вы где-либо декодируете токены вручную, проверьте оба утверждения. Лучше: используйтеgetUser()SDK, который сделает это за вас. - PRE — Audit cookie flags. Пользовательские файлы cookie сеанса должны иметь номер
Secure; HttpOnly; SameSite=Lax(илиStrictдля потоков, отличных от OAuth). ВlocalStorageнет материалов сессии. - PRE — Validate the
nextredirect param. Параметр запросаnextпосле входа в систему должен начинаться с/, а не//(открыть перенаправление на attacker.example). Отклонить все остальное на стороне сервера. - POST — Test logout. Войдите, выйдите из системы, проверьте файлы cookie (Инструменты разработчика → Приложение → Файлы cookie). Файл cookie сеанса должен быть удален в том же ответе. Если это сохраняется, обработчик выхода из системы фактически не разрушает состояние на стороне сервера.
- POST — Active probe. Auth Flow Defects и Account Enumeration проверяют нарушенные границы аутентификации — разные ответы на «пользователь существует» и «неправильный пароль», отсутствие ограничения скорости при входе в систему, неподписанные токены сброса.
HTTP заголовки безопасности и политика безопасности контента (6 элементов)
Заголовки — это самая дешевая защита во всем конвейере, и они чаще всего пропускаются кодегеном.
- PRE — Ship a real CSP. Минимум:
script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'. Нет'unsafe-inline'вscript-src. Next.js автоматически применяет nonce, когда промежуточное ПО устанавливает заголовок запросаx-nonce. - PRE — Add the legacy three.
X-Content-Type-Options: nosniff,X-Frame-Options: DENY(или полагаться только на CSPframe-ancestors),Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE — Tighten
Referrer-Policy. Значение по умолчаниюstrict-origin-when-cross-originподходит для большинства приложений. Не отправляйтеunsafe-urlили вообще не отправляйте заголовок. - PRE — Replace
Access-Control-Allow-Origin: *. Ждем этого. Замените явным списком разрешений происхождения. Где бы это ни было*рядом сcredentials: include, браузер отклонит запрос, но это не защита от неправильно настроенного бэкэнда. - DEPLOY — Verify headers post-deploy. Откройте DevTools → Сеть → щелкните корневой документ → вкладка «Заголовки». CSP, HSTS, X-Frame-Options, X-Content-Type-Options должны присутствовать. CSP не должно содержать
'unsafe-inline'вscript-src. - POST — Run HTTP Security Headers. Пассивная проверка заголовка сообщает о каждом отсутствующем заголовке с инструкциями по исправлению на платформе развертывания (Vercel
vercel.json, Cloudflare Pages_headers, Netlify_headers, Next.js промежуточное программное обеспечение).
Сторонние интеграции и APIs (5 шт.)
Каждый сценарий, который вы включаете, представляет собой исключение CSP и потенциальную возможность использования в цепочке поставок. Относитесь к третьим лицам как к границе вашего доверия.
- PRE — Reverse-proxy analytics where possible. PostHog, Правдоподобно, все умами поддерживают проксирование через ваш собственный домен (e.g.
/api/posthog). Это сохраняетconnect-srcтого же источника и выдерживает блокировку рекламы. - PRE — CSP-allowlist the rest. Для Google Analytics, Stripe.js, Sentry, Intercom, GTM и т. д. добавьте происхождение каждого поставщика в соответствующую директиву CSP (
script-srcдля загрузчиков,connect-srcдля телеметрии,frame-srcдля iframe,img-srcдля пикселей). - PRE — Use Stripe Checkout, not raw card forms. Stripe Checkout — это перенаправление верхнего уровня; для сценария не требуется запись CSP. Хостинговая поверхность PCI полностью находится в домене Stripe. Делайте свой собственный только в том случае, если у вас есть веская причина.
- PRE — Lock
package-lock.jsonin CI. Запускайтеnpm ci(неnpm install) в производственных сборках. Проверяйте зависимости с помощьюnpm auditили Snyk перед каждым выпуском. - POST — Watch Technology Fingerprinting. Пассивное обнаружение технологического стека обнаруживает версии библиотеки, видимые сканеру. Если вы отправляете EOL React, jQuery или Bootstrap, FixVibe помечает его и ссылается на известные CVE.
Гигиена развертывания и инфраструктура (8 позиций)
То, как вы развертываете, имеет такое же значение, как и то, что вы развертываете. AI-приложения с кодом особенно выигрывают от явного усиления защиты при развертывании.
- PRE — Disable
x-powered-by. Вnext.config.js:poweredByHeader: false. Удаляет бесплатный сигнал раскрытия версии. - PRE — Confirm middleware lives at
src/middleware.ts. В структуре каталогаsrc/Next.js игнорирует корневой уровеньmiddleware.ts. Неуместное промежуточное программное обеспечение молча не может установить CSP/заголовки аутентификации/ограничения скорости. - PRE — Sanity-check Vercel deployment protection. Proвыпуск должен быть публичным; Предварительный просмотр должен быть защищен паролем или доступен только членам организации. Vercel-Specific Exposure сообщает о поверхности.
- PRE — Block dotfile and config probes at the edge. Добавьте правило перезаписи или запрета для шаблонов
/.env,/.git/*,/.aws/*,/.next/trace. Vercel по умолчанию возвращает 403 для многих из них; перекрестная проверка. - DEPLOY — Separate environments. Production, Предварительный просмотр, Разработка. У каждого свой набор секретов. Живые ключи никогда не достигают предварительного просмотра, тестовый режим Stripe никогда не достигает Production.
- Планы DEPLOY — Enable Vercel Web Application Firewall. Pro и Enterprise включают WAF с управляемыми правилами. Cloudflare Pages имеет режим боя с ботами. И то, и другое снижает злоупотребление автоматическим сканером и нагрузку на распыление паролей.
- POST — Verify TLS configuration. SSL Labs или testssl.sh против вашего производственного домена. Минимум TLS 1.2, предпочтительнее TLS 1.3, без слабых шифров, возможна предварительная загрузка HSTS.
- POST — Confirm health-check endpoints are minimal.
/api/healthдолжен возвращать200 OKбез тела. Не повторяйте среду, не создавайте хэш и не развертывайте временную метку без аутентификации.
Постоянный мониторинг и повторное сканирование (4 объекта)
Безопасность — это не разовая проверка перед отправкой. Дрифт происходит при каждом развертывании.
- Verify your production domain in FixVibe. Dashboard → Domains → DNS TXT or HTTP file verification. Active scans require Hobby or above, scheduled scans require Pro or Unlimited, and live threat monitoring requires Unlimited.
- Schedule passive re-scans on Pro or Unlimited. Choose an available cadence for your verified domain. Scheduled runs share your scan allowance; enable completion notifications and signed webhooks as needed. A scheduled scan observes the app at run time, not continuously.
- Wire outbound webhooks. Account → Webhooks → добавьте конечную точку HTTPS, подпишитесь на
scan.completed+finding.created+scan.active_api.first_used. Рутируем в Slack/Discord/PagerDuty. - Enable live threat monitoring on Unlimited. Periodic certificate, DNS, bundle, and threat-intelligence checks can surface changes between scheduled scans. Coverage and alert timing depend on the signal and successful polling.
Replit Agent
If you build with Replit Agent, also check:
- Don't paste keys into the Agent prompt. Add them in Secrets and give the Agent the variable name instead, so the value never appears in generated code or chat history.
- Test CORS on the production domain. The preview pane and your deployed URL are different origins. Check your CORS allowlist against the domain users actually load.
- Replit Agent sometimes hardcodes test values. Агент может генерировать код с
API_URL = 'http://localhost:5000</code>. Перед отправкой замените на <code>os.environ[API_URL'].
Firebase Studio
If you build with Firebase Studio, also check:
- Test-mode rules are temporary by intent, not by default. Test mode lets anyone read and overwrite data. If the generated rule carries a date cutoff, client access stops on that date; if not, the database stays open. Replace test rules before launch either way.
- Security rules protect data, not Hosting. Firestore and Storage rules don't govern what Firebase Hosting serves: everything in the public directory is public. Keep exports, backups and admin pages out of it.
Claude Code
If you build with Claude Code, also check:
- PRE — Keep personal Claude Code settings out of git. Commit
.claude/settings.jsonfor shared project settings, but keep.claude/settings.local.jsonout of the repo: Claude Code excludes it from git when it creates the file, so check it if you created it by hand. Session history lives in~/.claude, outside the project (Claude Code docs). - Bash operations are unverified. Claude Code выполняет команды bash напрямую.
git commit -m "fix"удобно, но если в рабочем каталоге есть файл.envи он включается в glob, он фиксируется. Всегда проверяйтеgit diff --cachedперед тем, как Claude Code примет решение.
Следующие шаги
Хотите получить образовательную информацию о том, почему эти предметы важны? Прочтите AI-generated code security scanning. Хотите конкретные фрагменты кода для каждого этапа повышения безопасности? См. How to secure an app built with AI coding tools.
