// docs / security guides / pre-ship checklist
Чек-лист безопасности vibe coding: 44 пункта перед запуском
Практичный, поэтапный контрольный список для приложений, созданных с помощью Cursor, Claude Code, Lovable, Bolt, v0, Replit и Windsurf. Каждый пункт можно выполнить менее чем за пять минут. Проходите его перед запуском в производство, а затем еще раз перед каждым крупным выпуском. Элементы сгруппированы в семь категорий — секреты, база данных, аутентификация, заголовки, сторонние, развертывание, мониторинг — и помечены фазой развертывания, к которой они относятся.
PRE = предварительное развертывание (проверка источника). DEPLOY = во время развертывания. POST = проверка после развертывания. Ссылка на элементы FixVibe, проверьте идентификаторы в форме category.check-id, где это необходимо.
Секреты и ключи 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.browser-storage выявляет ключи, которые попали вlocalStorageилиsessionStorageиз-за неправильного использования SDK. - POST — Rotate any key that ever shipped. Если ключ находился в общедоступном пакете хотя бы несколько минут, считайте его скомпрометированным. Ротация ключей сервисной роли Supabase через панель управления, повторное создание ограниченных ключей Stripe, отзыв ключей Anthropic/OpenAI/Google через их консоли.
Контроль доступа к базе данных: правила RLS и Firestore (6 шт.)
BaaS значения по умолчанию намеренно являются разрешающими, поэтому первое руководство работает. Production требует четкой политики.
- PRE — Force RLS on every
public.*table. В Supabase: каждая таблица должна иметьALTER TABLE ... ENABLE ROW LEVEL SECURITYиFORCE ROW LEVEL SECURITY. Force имеет значение: без него Postgres обходит RLS для владельцев таблиц. - 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. Активная проверка baas.supabase-rls записывает в крошечную начальную строку с помощью ключа 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. active.auth-flow и active.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 headers.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 discovery.tech-fingerprint. Пассивное обнаружение технологического стека обнаруживает версии библиотеки, видимые сканеру. Если вы отправляете 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выпуск должен быть публичным; Предварительный просмотр должен быть защищен паролем или доступен только членам организации. discovery.platform-vercel сообщает о поверхности.
- 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 или HTTP проверка файла. Это открывает возможность планового повторного сканирования, активного зондирования и мониторинга угроз в реальном времени.
- Планы Schedule passive re-scans. Pro поддерживают 3-часовой ритм; Unlimited поддерживает 6-часовой ритм. Каждое запланированное сканирование, выявляющее новые результаты, запускает электронное письмо (и вебхук, если вы его подключили).
- Wire outbound webhooks. Account → Webhooks → добавьте конечную точку HTTPS, подпишитесь на
scan.completed+finding.created+scan.active_api.first_used. Рутируем в Slack/Discord/PagerDuty. - Enable live threat monitoring on Unlimited. Различия в журналах прозрачности сертификатов, изменения DNS, утечки секретов пакетов JS, списки угроз — активируются в момент их обнаружения, а не при следующем запланированном сканировании.
Следующие шаги
Хотите получить образовательную информацию о том, почему эти предметы важны? Прочтите AI-generated code security scanning. Хотите конкретные фрагменты кода для каждого этапа повышения безопасности? См. How to secure an app built with AI coding tools.
