// docs / security guides / pre-ship checklist
Die Vibe-Coding-Security-Checkliste: 51 Punkte vor dem Deploy
Eine praktische, nach Phasen gegliederte Checkliste für Apps, die mit Cursor, Claude Code, Lovable, Bolt, v0, Replit und Windsurf erstellt wurden. Jeder Punkt ist in weniger als fünf Minuten umsetzbar. Gehen Sie es durch, bevor Sie mit der Produktion beginnen, und dann noch einmal vor jeder Hauptversion. Elemente werden in sieben Kategorien gruppiert – Geheimnisse, Datenbank, Authentifizierung, Header, Drittanbieter, Bereitstellung, Überwachung – und mit der Bereitstellungsphase gekennzeichnet, für die sie gelten.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
Geheimnisse und API Schlüssel (8 Artikel)
Hartcodierte Schlüssel sind der häufigste Befund in Vibe-codierten Apps. Acht Dinge, um sie fernzuhalten:
- PRE — Audit
NEXT_PUBLIC_env vars. Alles mit dem PräfixNEXT_PUBLIC_wird in Client-Paketen geliefert. Wenn einer ein Supabaseservice_role-Schlüssel ist (dekodiert zu JWT mit"role":"service_role"), löschen Sie ihn und leiten Sie ihn über einen Nur-Server-Client (src/lib/supabase/service.tsmitimport 'server-only') weiter. - PRE — Grep for hardcoded provider keys. Suchquelle für
sk_live_,pk_live_,STRIPE_SECRET,sk-ant-,sk-,AIza,AKIAund JWT-aussehenden Zeichenfolgen (eyJ). Verschieben Sie jeden Treffer in.env.localund referenzieren Sie ihn nur serverseitig überprocess.env.*. - PRE — Verify
.gitignore. Bestätigen Sie.env*.local,.npmrc,.yarnrcund alle anbieterspezifischen Anmeldeinformationsdateien werden ignoriert. Führen Siegit ls-filesdurch Ihre Providermuster weiter, um alles zu finden, was bereits festgeschrieben wurde. - PRE — Scan the built bundle. Führen Sie
npm run buildaus, dann grep.next/staticund alledist/-Ausgaben für die gleichen Muster. Wenn ein Schlüssel das Bundle erreicht, hatte der Entwickler nie eine saubere Umgebungstrennung. - DEPLOY — Set secrets per environment. Vercel: Einstellungen → Umgebungsvariablen, jeweils auf ProProduktion / Vorschau / Entwicklung anwendbar. Teilen Sie niemals
sk_live_*mit der Vorschauumgebung. Verwenden Sie den verschlüsselten Env-Var-Speicher von Vercel, keine Inline-Workflow-Geheimnisse. - DEPLOY — Disable build-log secret echo. Einige CI Konfigurationen
echoUmgebungsvariablen während des Builds. Überprüfen Sie Ihrevercel.json-, GitHub Aktions-Workflows oder Cloudflare Seiteneinstellungen auf alleecho $SECRET, die den Wert in öffentliche Build-Protokolle verschieben würden. - Die Stufe Free von POST — Run a passive scan. FixVibe deckt Folgendes ab: Fügen Sie das bereitgestellte URL ein, warten Sie ca. 20 Sekunden und suchen Sie nach
secrets.*-Ergebnissen. Der Secrets in JavaScript Bundles-Check fängt Schlüssel ab, die durch einen Missbrauch von SDK inlocalStorageodersessionStoragegelandet sind. - POST — Rotate any key that ever shipped. Wenn ein Schlüssel gerade Minuten lang in einem öffentlichen Paket war, behandeln Sie ihn als kompromittiert. Rotieren Sie Supabase Dienstrollenschlüssel über das Dashboard, generieren Sie Stripe eingeschränkte Schlüssel neu und widerrufen Sie Anthropic-/OpenAI-/Google-Schlüssel über ihre Konsolen.
Datenbankzugriffskontrolle: RLS und Firestore-Regeln (6 Elemente)
Die Standardeinstellungen von BaaS sind absichtlich freizügig, sodass das erste Tutorial funktioniert. Production benötigt explizite Richtlinien.
- 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). Minimum: eine SELECT-Richtlinie, die am
auth.uid()beitritt. Besser: separate INSERT / UPDATE / DELETE Richtlinien, damit ein UPDATE keineuser_idÄnderungen einschleusen kann, die den Besitz umleiten. - PRE — Replace default Firebase rules. Die Standardregeln für den Testmodus lauten
allow read, write: if true;. Durch authentisierungsgebundene Regeln pro Sammlung ersetzen:match /users/{userId}durchallow read, write: if request.auth.uid == userId; - PRE — Lint migrations in CI. Führen Sie vor dem Zusammenführen
supabase db lintoder ein Äquivalent aus. CI sollte beim Build fehlschlagen, wenn einemCREATE TABLE public.*eine passende RLS-Richtlinie fehlt. - DEPLOY — Confirm RLS survived deploy. Nach der Bereitstellung erneut in Supabase Studio einchecken: Tabellen → jede Zeile → RLS Umschalter ist ON. Production-Datenbankmigrationen eilen gelegentlich den Richtliniendateien voraus; Überprüfen Sie, ob die Richtlinie aktiv ist.
- POST — Run an active scan against a verified domain. Die aktive Prüfung Supabase Row-Level Security schreibt mit der Anon-Taste in eine kleine Startzeile und meldet zurück, ob der Schreibvorgang erfolgreich war – i.e. RLS ist nicht wirklich erzwingend.
Authentifizierung und Sitzungen (7 Elemente)
Authentifizierungsfehler in AI--codierten Apps sind in der Regel subtil: ein Fehler bei der Token-Verifizierung, ein fehlendes HttpOnly-Flag, ein getSession(), wo eigentlich ein getUser() stehen sollte.
- PRE — Replace
getSession()withgetUser().getSession()liest das Cookie und vertraut ihm;getUser()überprüft mit dem Supabase Backend. Verwenden Sie auf Serverrouten immergetUser(). - PRE — Confirm token expiry. Magic-Link-, Passwort-Reset- und E-Mail-Verifizierungs-Tokens benötigen einen vom Server erzwungenen Ablauf. Standardmäßige Supabase Magic-Links laufen nach einer Stunde ab – überschreiben Sie diese Zahl nicht ohne triftigen Grund mit einer höheren Zahl.
- PRE — Verify JWT
audandexp. Wenn Sie Token irgendwo manuell entschlüsseln, überprüfen Sie beide Ansprüche. Besser: Verwenden Sie SDKsgetUser(), das das für Sie erledigt. - PRE — Audit cookie flags. Benutzerdefinierte Sitzungscookies sollten
Secure; HttpOnly; SameSite=Laxsein (oderStrictfür Nicht-OAuth-Flows). Kein Sitzungsmaterial inlocalStorage. - PRE — Validate the
nextredirect param. Der Abfrageparameternextnach der Anmeldung muss mit/und nicht mit//beginnen (offene Weiterleitung zu attacker.example). Alles andere serverseitig ablehnen. - POST — Test logout. Anmelden, abmelden, Cookies überprüfen (DevTools → Anwendung → Cookies). Das Sitzungscookie muss bei derselben Antwort gelöscht werden. Wenn es weiterhin besteht, zerstört der Logout-Handler den serverseitigen Status nicht wirklich.
- POST — Active probe. Die Auth Flow Defects- und Account Enumeration-Prüfungen zeigen gebrochene Authentifizierungsgrenzen auf – unterschiedliche Antworten auf „Benutzer existiert“ vs. „falsches Passwort“, fehlendes Ratenlimit bei der Anmeldung, nicht signierte Reset-Tokens.
HTTP Sicherheitsheader und Inhaltssicherheitsrichtlinie (6 Elemente)
Header sind die kostengünstigste Härtung in der gesamten Pipeline und werden von Codegen am häufigsten übersprungen.
- PRE — Ship a real CSP. Minimum:
script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'. Kein'unsafe-inline'inscript-src. Next.js wendet die Nonce automatisch an, wenn Middleware denx-nonce-Anforderungsheader festlegt. - PRE — Add the legacy three.
X-Content-Type-Options: nosniff,X-Frame-Options: DENY(oder verlassen Sie sich allein auf CSPframe-ancestors),Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE — Tighten
Referrer-Policy. Die Standardeinstellungstrict-origin-when-cross-originist für die meisten Apps in Ordnung. Versenden Sie nichtunsafe-urloder überhaupt keinen Header. - PRE — Replace
Access-Control-Allow-Origin: *. Grep dafür. Durch eine explizite Ursprungszulassungsliste ersetzen. Überall dort, wo*nebencredentials: includesteht, lehnt der Browser die Anfrage ab – aber das ist kein Schutz gegen ein falsch konfiguriertes Backend. - DEPLOY — Verify headers post-deploy. Öffnen Sie DevTools → Netzwerk → klicken Sie auf Ihr Stammdokument → Registerkarte „Kopfzeilen“. CSP, HSTS, X-Frame-Options, X-Content-Type-Options sollten vorhanden sein. CSP darf nicht
'unsafe-inline'inscript-srchaben. - POST — Run HTTP Security Headers. Die passive Header-Prüfung meldet jeden fehlenden Header mit Anleitung zur Fehlerbehebung auf der Bereitstellungsplattform (Vercel
vercel.json, Cloudflare Seiten_headers, Netlify_headers, Next.js Middleware).
Integrationen von Drittanbietern und APIs (5 Elemente)
Jedes von Ihnen eingefügte Skript stellt eine CSP-Ausnahme und eine potenzielle Lieferkettenoberfläche dar. Behandeln Sie Dritte als Teil Ihrer Vertrauensgrenze.
- PRE — Reverse-proxy analytics where possible. PostHog, Plausible, Umami unterstützen alle das Proxying über Ihre eigene Domain (e.g.
/api/posthog). Dadurch bleibtconnect-srcauf dem gleichen Ursprung und übersteht Werbeblocker. - PRE — CSP-allowlist the rest. Fügen Sie für Google Analytics, Stripe.js, Sentry, Intercom, GTM usw. die Ursprünge jedes Anbieters zur entsprechenden CSP-Anweisung hinzu (
script-srcfür Loader,connect-srcfür Telemetrie,frame-srcfür Iframes,img-srcfür Pixel). - PRE — Use Stripe Checkout, not raw card forms. Stripe Checkout ist eine Weiterleitung auf oberster Ebene; Für das Skript ist kein CSP-Eintrag erforderlich. Die gehostete Oberfläche von PCI befindet sich vollständig auf der Domain von Stripe. Rollen Sie Ihre eigenen nur, wenn Sie einen triftigen Grund haben.
- PRE — Lock
package-lock.jsonin CI. Führen Sienpm ci(nichtnpm install) in Produktions-Builds aus. Prüfen Sie Abhängigkeiten mitnpm auditoder Snyk vor jeder Veröffentlichung. - POST — Watch Technology Fingerprinting. Die passive Tech-Stack-Erkennung zeigt Bibliotheksversionen an, die für einen Crawler sichtbar sind. Wenn Sie ein EOL React, jQuery oder Bootstrap versenden, markiert FixVibe es und verlinkt auf bekannte CVEs.
Einsatzhygiene und Infrastruktur (8 Artikel)
Wie Sie bereitstellen, ist genauso wichtig wie das, was Sie bereitstellen. AI-codierte Apps profitieren besonders von der expliziten Bereitstellungshärtung.
- PRE — Disable
x-powered-by. Innext.config.js:poweredByHeader: false. Entfernt ein kostenloses Versionsoffenlegungssignal. - PRE — Confirm middleware lives at
src/middleware.ts. Beim Verzeichnislayoutsrc/ignoriert Next.js einmiddleware.tsauf Stammebene. Falsch platzierte Middleware schafft es stillschweigend nicht, CSP / Authentifizierungsheader / Ratenlimits festzulegen. - PRE — Sanity-check Vercel deployment protection. ProDie Verabschiedung sollte öffentlich sein; Die Vorschau sollte passwortgeschützt oder auf Organisationsmitglieder beschränkt sein. Vercel-Specific Exposure meldet die Oberfläche.
- PRE — Block dotfile and config probes at the edge. Fügen Sie eine Umschreibe- oder Ablehnungsregel für die Muster
/.env,/.git/*,/.aws/*,/.next/tracehinzu. Vercel gibt für viele davon standardmäßig 403 zurück; Gegenprüfung. - DEPLOY — Separate environments. ProProduktion, Vorschau, Entwicklung. Jeder hat seine eigenen Geheimnisse. Live-Keys erreichen nie die Vorschau, der Stripe Testmodus erreicht nie die ProReduktion.
- DEPLOY — Enable Vercel Web Application Firewall. Pro und Enterprise-Pläne beinhalten WAF mit verwalteten Regeln. Cloudflare Pages verfügt über einen Bot-Kampfmodus. Beides reduziert den Missbrauch automatisierter Scanner und die Belastung durch das Sprühen von Passwörtern.
- POST — Verify TLS configuration. SSL Labs oder testssl.sh für Ihre Produktionsdomäne. Mindestens TLS 1.2, vorzugsweise TLS 1.3, keine schwachen Chiffren, HSTS Vorladung möglich.
- POST — Confirm health-check endpoints are minimal. Ein
/api/healthsollte200 OKohne Text zurückgeben. Geben Sie kein Umgebungsecho ab, erstellen Sie keinen Hash und stellen Sie keinen Zeitstempel ohne Authentifizierung bereit.
Laufende Überwachung und erneutes Scannen (4 Artikel)
Sicherheit ist kein einmaliges Audit vor dem Versand. Bei jedem Einsatz kommt es zu Drift.
- 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 → einen HTTPS Endpunkt hinzufügen,
scan.completed+finding.created+scan.active_api.first_usedabonnieren. In Slack / Discord / PagerDuty weiterleiten. - 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. Der Agent generiert möglicherweise Code mit
API_URL = 'http://localhost:5000</code>. Vor dem Versand durch <code>os.environ[API_URL']ersetzen.
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 führt Bash-Befehle direkt aus.
git commit -m "fix"ist praktisch, aber wenn das Arbeitsverzeichnis eine.env-Datei hat und diese in einem Glob enthalten ist, erfolgt ein Commit. Überprüfen Sie immergit diff --cached, bevor Claude Code ein Commit durchführt.
Nächste Schritte
Möchten Sie wissen, warum diese Dinge wichtig sind? Lesen Sie AI-generated code security scanning. Möchten Sie konkrete Codeausschnitte für jeden Härtungsschritt? Siehe How to secure an app built with AI coding tools.
