FixVibe

// docs / security guides / pre-ship checklist

Checklist keamanan vibe coding: 51 item sebelum rilis

Daftar periksa praktis dan bertahap untuk aplikasi yang dibuat dengan Cursor, Claude Code, Lovable, Bolt, v0, Replit, dan Windsurf. Setiap item dapat ditindaklanjuti dalam waktu kurang dari lima menit. Jalankan sebelum Anda mendorong ke produksi, lalu jalankan lagi sebelum setiap rilis besar. Item dikelompokkan ke dalam tujuh kategori β€” rahasia, database, autentikasi, header, pihak ketiga, penerapan, pemantauan β€” dan ditandai dengan fase penerapan item tersebut.

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

Rahasia dan kunci API (8 item)

Kunci berkode keras adalah satu-satunya temuan paling umum dalam aplikasi berkode getaran. Delapan item untuk mencegahnya:

  1. PRE β€” Audit NEXT_PUBLIC_ env vars. Apa pun yang diawali NEXT_PUBLIC_ dikirimkan dalam paket klien. Jika salah satunya adalah kunci Supabase service_role (didekodekan menjadi JWT dengan "role":"service_role"), hapus kunci tersebut dan rutekan melalui klien khusus server (src/lib/supabase/service.ts dengan import 'server-only').
  2. PRE β€” Grep for hardcoded provider keys. Cari sumber untuk sk_live_, pk_live_, STRIPE_SECRET, sk-ant-, sk-, AIza, AKIA, dan JWT- mencari string (eyJ). Pindahkan setiap klik ke .env.local dan referensi melalui process.env.* hanya di sisi server.
  3. PRE β€” Verify .gitignore. Konfirmasi .env*.local, .npmrc, .yarnrc, dan file kredensial khusus penyedia apa pun akan diabaikan. Jalankan git ls-files yang disalurkan melalui pola penyedia Anda untuk menemukan apa pun yang sudah dikomit.
  4. PRE β€” Scan the built bundle. Jalankan npm run build, lalu grep .next/static dan keluaran dist/ apa pun untuk pola yang sama. Jika kunci mencapai bundel, pengembang tidak pernah melakukan pemisahan env yang bersih.
  5. DEPLOY β€” Set secrets per environment. Vercel: Pengaturan β†’ Variabel Lingkungan, masing-masing mencakup Produksi / Pratinjau / Pengembangan. Jangan pernah berbagi sk_live_* dengan lingkungan Pratinjau. Gunakan penyimpanan env-var terenkripsi Vercel, bukan rahasia alur kerja sebaris.
  6. DEPLOY β€” Disable build-log secret echo. Beberapa konfigurasi CI echo env vars selama pembuatan. Audit alur kerja vercel.json, GitHub Tindakan, atau setelan Halaman Cloudflare Anda untuk setiap echo $SECRET yang akan memasukkan nilai ke dalam log build publik.
  7. Tingkat POST β€” Run a passive scan. FixVibe Free mencakup ini: tempel URL yang diterapkan, tunggu ~20 detik, cari temuan secrets.*. Cek Secrets in JavaScript Bundles menangkap kunci yang masuk ke localStorage atau sessionStorage melalui penyalahgunaan SDK.
  8. POST β€” Rotate any key that ever shipped. Jika kunci berada dalam paket publik selama beberapa menit, perlakukan kunci tersebut sebagai telah disusupi. Memutar kunci peran layanan Supabase melalui dasbor, membuat ulang kunci terbatas Stripe, mencabut kunci Anthropic / OpenAI / Google melalui konsolnya.

Kontrol akses basis data: RLS dan aturan Firestore (6 item)

BaaS defaultnya sengaja dibuat permisif agar tutorial pertama berhasil. Production memerlukan kebijakan yang eksplisit.

  1. PRE β€” Enable RLS on every public.* table. In Supabase: each table needs ALTER TABLE ... ENABLE ROW LEVEL SECURITY plus explicit policies for each role. RLS is what stops the anon and authenticated API roles; FORCE ROW LEVEL SECURITY only extends it to the table owner and is optional defence in depth.
  2. PRE β€” Write a policy per (table, role, action). Minimum: kebijakan SELECT yang bergabung pada auth.uid(). Lebih baik: pisahkan kebijakan INSERT / UPDATE / DELETE sehingga UPDATE tidak dapat menyelundupkan user_id perubahan yang mengalihkan kepemilikan.
  3. PRE β€” Replace default Firebase rules. Aturan mode pengujian default dibaca allow read, write: if true;. Ganti dengan aturan terikat autentikasi per koleksi: match /users/{userId} dengan allow read, write: if request.auth.uid == userId;
  4. PRE β€” Lint migrations in CI. Jalankan supabase db lint atau yang setara sebelum menggabungkan. CI akan gagal dalam pembangunan jika ada CREATE TABLE public.* yang tidak memiliki kebijakan RLS yang cocok.
  5. DEPLOY β€” Confirm RLS survived deploy. Periksa ulang di Supabase Studio setelah penerapan: Tabel β†’ setiap baris β†’ RLS tombolnya adalah ON. Pro migrasi database terkadang mendahului file kebijakan; memverifikasi bahwa kebijakan tersebut aktif.
  6. POST β€” Run an active scan against a verified domain. Cek aktif Supabase Row-Level Security menulis ke baris benih kecil menggunakan kunci anon dan melaporkan kembali jika penulisan berhasil β€” i.e. RLS sebenarnya tidak menegakkan.

Otentikasi dan sesi (7 item)

Bug autentikasi dalam aplikasi berkode AI- cenderung tidak kentara: verifikasi token satu per satu, tanda HttpOnly yang terlewat, tanda getSession() yang seharusnya ada getUser().

  1. PRE β€” Replace getSession() with getUser(). getSession() membaca cookie dan mempercayainya; getUser() memverifikasi dengan backend Supabase. Pada rute server selalu gunakan getUser().
  2. PRE β€” Confirm token expiry. Tautan ajaib, penyetelan ulang kata sandi, dan token verifikasi email memerlukan masa berlaku yang diberlakukan oleh server. Tautan ajaib Supabase default akan kedaluwarsa setelah 1 jam β€” jangan timpa ke angka yang lebih tinggi tanpa alasan yang jelas.
  3. PRE β€” Verify JWT aud and exp. Jika Anda mendekode token secara manual di mana saja, periksa kedua klaim. Lebih baik: gunakan SDK getUser() yang dapat melakukannya untuk Anda.
  4. PRE β€” Audit cookie flags. Cookie sesi khusus harus Secure; HttpOnly; SameSite=Lax (atau Strict untuk alur non-OAuth). Tidak ada materi sesi di localStorage.
  5. PRE β€” Validate the next redirect param. Parameter kueri next setelah masuk harus dimulai dengan / dan bukan // (pengalihan terbuka ke attacker.example). Tolak apa pun di sisi server.
  6. POST β€” Test logout. Masuk, keluar, periksa cookie (DevTools β†’ Aplikasi β†’ Cookie). Cookie sesi harus dihapus pada respons yang sama. Jika masalah ini terus berlanjut, penangan logout tidak benar-benar merusak status sisi server.
  7. POST β€” Active probe. Pemeriksaan Auth Flow Defects dan Account Enumeration memunculkan batasan autentikasi yang rusak β€” respons berbeda pada "pengguna ada" vs "kata sandi salah", batas kecepatan login tidak ada, token reset yang tidak ditandatangani.

HTTP header keamanan dan Kebijakan Keamanan Konten (6 item)

Header adalah pengerasan termurah di seluruh pipeline dan paling konsisten dilewati oleh codegen.

  1. PRE β€” Ship a real CSP. Minimal: script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'. Tidak ada 'unsafe-inline' di script-src. Next.js menerapkan nonce secara otomatis ketika middleware menyetel header permintaan x-nonce.
  2. PRE β€” Add the legacy three. X-Content-Type-Options: nosniff, X-Frame-Options: DENY (atau mengandalkan CSP frame-ancestors saja), Strict-Transport-Security: max-age=31536000; includeSubDomains.
  3. PRE β€” Tighten Referrer-Policy. Default strict-origin-when-cross-origin baik untuk sebagian besar aplikasi. Jangan kirim unsafe-url atau tanpa header sama sekali.
  4. PRE β€” Replace Access-Control-Allow-Origin: *. Terima kasih. Ganti dengan daftar asal yang diizinkan secara eksplisit. Di mana pun * dan credentials: include, browser akan menolak permintaan tersebut β€” namun hal tersebut bukan merupakan pertahanan terhadap backend yang salah dikonfigurasi.
  5. DEPLOY β€” Verify headers post-deploy. Buka DevTools β†’ Jaringan β†’ klik dokumen root Anda β†’ tab Header. CSP, HSTS, X-Frame-Options, X-Content-Type-Options harus ada. CSP tidak boleh memiliki 'unsafe-inline' di script-src.
  6. POST β€” Run HTTP Security Headers. Pemeriksaan header pasif melaporkan setiap header yang hilang dengan panduan perbaikan platform penerapan (Vercel vercel.json, Cloudflare Halaman _headers, Netlify _headers, Next.js middleware).

Integrasi pihak ketiga dan API (5 item)

Setiap skrip yang Anda sertakan adalah pengecualian CSP dan potensi permukaan rantai pasokan. Perlakukan pihak ketiga sebagai bagian dari batasan kepercayaan Anda.

  1. PRE β€” Reverse-proxy analytics where possible. PostHog, Masuk akal, Umami semuanya mendukung proksi melalui domain Anda sendiri (e.g. /api/posthog). Hal ini menjaga connect-src tetap pada asal yang sama dan bertahan dari pemblokir iklan.
  2. PRE β€” CSP-allowlist the rest. Untuk Google Analytics, Stripe.js, Sentry, Intercom, GTM, dll., tambahkan masing-masing asal vendor ke direktif CSP yang cocok (script-src untuk loader, connect-src untuk telemetri, frame-src untuk iframe, img-src untuk piksel).
  3. PRE β€” Use Stripe Checkout, not raw card forms. Stripe Checkout adalah pengalihan tingkat atas; tidak diperlukan entri CSP untuk skrip. Permukaan PCI yang dihosting sepenuhnya ada di domain Stripe. Gulung sendiri hanya jika Anda memiliki alasan yang kuat.
  4. PRE β€” Lock package-lock.json in CI. Jalankan npm ci (bukan npm install) dalam build produksi. Audit dependensi dengan npm audit atau Snyk sebelum setiap rilis.
  5. POST β€” Watch Technology Fingerprinting. Penemuan tumpukan teknologi pasif menampilkan versi perpustakaan yang dapat dilihat oleh perayap. Jika Anda mengirimkan EOL React, jQuery, atau Bootstrap, FixVibe menandainya dan menautkannya ke CVE yang dikenal.

Kebersihan dan infrastruktur penempatan (8 item)

Cara Anda menerapkannya sama pentingnya dengan apa yang Anda terapkan. AI- Aplikasi berkode khususnya mendapat manfaat dari pengerasan penerapan eksplisit.

  1. PRE β€” Disable x-powered-by. Di next.config.js: poweredByHeader: false. Menghapus sinyal pengungkapan versi gratis.
  2. PRE β€” Confirm middleware lives at src/middleware.ts. Dengan tata letak direktori src/, Next.js mengabaikan level root middleware.ts. Middleware yang salah tempat secara diam-diam gagal menyetel CSP / header autentikasi / batas kecepatan.
  3. PRE β€” Sanity-check Vercel deployment protection. Produksi harus bersifat publik; Pratinjau harus dilindungi kata sandi atau dibatasi untuk anggota organisasi. Vercel-Specific Exposure melaporkan permukaannya.
  4. PRE β€” Block dotfile and config probes at the edge. Tambahkan aturan penulisan ulang atau penolakan untuk pola /.env, /.git/*, /.aws/*, /.next/trace. Vercel mengembalikan 403 untuk banyak diantaranya secara default; pemeriksaan kembali.
  5. DEPLOY β€” Separate environments. Produksi, Pratinjau, Pengembangan. Masing-masing mempunyai rahasia tersendiri. Kunci langsung tidak pernah mencapai Pratinjau, mode pengujian Stripe tidak pernah mencapai Produksi.
  6. DEPLOY β€” Enable Vercel Web Application Firewall. Pro dan paket Perusahaan mencakup WAF dengan aturan terkelola. Cloudflare Halaman memiliki Mode Pertarungan Bot. Keduanya mengurangi penyalahgunaan pemindai otomatis dan beban semprotan kata sandi.
  7. POST β€” Verify TLS configuration. SSL Labs atau testssl.sh terhadap domain produksi Anda. TLS minimum 1,2, pilih TLS 1.3, tidak ada sandi yang lemah, HSTS pramuat memenuhi syarat.
  8. POST β€” Confirm health-check endpoints are minimal. A /api/health harus kembali 200 OK tanpa tubuh. Jangan menggemakan lingkungan, membuat hash, atau menerapkan stempel waktu tanpa autentikasi.

Pemantauan berkelanjutan dan pemindaian ulang (4 item)

Keamanan bukanlah audit pra-kapal yang dilakukan satu kali saja. Drift terjadi pada setiap penerapan.

  1. 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.
  2. 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.
  3. Wire outbound webhooks. Account β†’ Webhooks β†’ tambahkan titik akhir HTTPS, berlangganan scan.completed + finding.created + scan.active_api.first_used. Rutekan ke Slack / Discord / PagerDuty.
  4. 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:

  1. 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.
  2. 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.
  3. Replit Agent sometimes hardcodes test values. Agen mungkin menghasilkan kode dengan API_URL = 'http://localhost:5000</code>. Sebelum dikirim, ganti dengan <code>os.environ[API_URL'].

Firebase Studio

If you build with Firebase Studio, also check:

  1. 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.
  2. 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:

  1. PRE β€” Keep personal Claude Code settings out of git. Commit .claude/settings.json for shared project settings, but keep .claude/settings.local.json out 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).
  2. Bash operations are unverified. Claude Code mengeksekusi perintah bash secara langsung. git commit -m "fix" memang nyaman, tetapi jika direktori kerja memiliki file .env dan sebuah glob menyertakannya, maka ia akan dikomit. Selalu tinjau git diff --cached sebelum Claude Code melakukan.

Langkah selanjutnya

Ingin latar belakang pendidikan tentang mengapa barang-barang ini penting? Baca AI-generated code security scanning. Ingin cuplikan kode konkret untuk setiap langkah pengerasan? Lihat How to secure an app built with AI coding tools.

// scan your app

Cukup membaca. Saatnya temukan celah di aplikasimu.

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 tingkat β€” 3 pemindaian / bulan, tanpa kartu.
  • Pemindaian pasif terhadap URL apa pun β€” tidak memerlukan verifikasi domain.
  • Disetel untuk Cursor, Claude Code, Lovable, Bolt, v0, Replit.
  • Coding-agent prompts for code/config findings, plus operator steps for DNS/provider fixes.
Checklist keamanan vibe coding: 51 item sebelum rilis Β· FixVibe