// docs / security guides / pre-ship checklist
Checklist keamanan vibe coding: 44 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 = pra-penerapan (audit sumber Anda). DEPLOY = pada waktu penerapan. POST = verifikasi pasca penerapan. Referensi item FixVibe periksa ID dalam formulir category.check-id jika relevan.
Rahasia dan kunci API (8 item)
Kunci berkode keras adalah satu-satunya temuan paling umum dalam aplikasi berkode getaran. Delapan item untuk mencegahnya:
- PRE โ Audit
NEXT_PUBLIC_env vars. Apa pun yang diawaliNEXT_PUBLIC_dikirimkan dalam paket klien. Jika salah satunya adalah kunci Supabaseservice_role(didekodekan menjadi JWT dengan"role":"service_role"), hapus kunci tersebut dan rutekan melalui klien khusus server (src/lib/supabase/service.tsdenganimport 'server-only'). - 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.localdan referensi melaluiprocess.env.*hanya di sisi server. - PRE โ Verify
.gitignore. Konfirmasi.env*.local,.npmrc,.yarnrc, dan file kredensial khusus penyedia apa pun akan diabaikan. Jalankangit ls-filesyang disalurkan melalui pola penyedia Anda untuk menemukan apa pun yang sudah dikomit. - PRE โ Scan the built bundle. Jalankan
npm run build, lalu grep.next/staticdan keluarandist/apa pun untuk pola yang sama. Jika kunci mencapai bundel, pengembang tidak pernah melakukan pemisahan env yang bersih. - 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. - DEPLOY โ Disable build-log secret echo. Beberapa konfigurasi CI
echoenv vars selama pembuatan. Audit alur kerjavercel.json, GitHub Tindakan, atau setelan Halaman Cloudflare Anda untuk setiapecho $SECRETyang akan memasukkan nilai ke dalam log build publik. - Tingkat POST โ Run a passive scan. FixVibe Free mencakup ini: tempel URL yang diterapkan, tunggu ~20 detik, cari temuan
secrets.*. Cek secrets.browser-storage menangkap kunci yang masuk kelocalStorageatausessionStoragemelalui penyalahgunaan SDK. - 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.
- PRE โ Force RLS on every
public.*table. Di Supabase: setiap tabel harus memilikiALTER TABLE ... ENABLE ROW LEVEL SECURITYdanFORCE ROW LEVEL SECURITY. Force penting: tanpanya, Postgres melewati RLS untuk pemilik tabel. - 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 menyelundupkanuser_idperubahan yang mengalihkan kepemilikan. - 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}denganallow read, write: if request.auth.uid == userId; - PRE โ Lint migrations in CI. Jalankan
supabase db lintatau yang setara sebelum menggabungkan. CI akan gagal dalam pembangunan jika adaCREATE TABLE public.*yang tidak memiliki kebijakan RLS yang cocok. - 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.
- POST โ Run an active scan against a verified domain. Cek aktif baas.supabase-rls 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().
- PRE โ Replace
getSession()withgetUser().getSession()membaca cookie dan mempercayainya;getUser()memverifikasi dengan backend Supabase. Pada rute server selalu gunakangetUser(). - 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.
- PRE โ Verify JWT
audandexp. Jika Anda mendekode token secara manual di mana saja, periksa kedua klaim. Lebih baik: gunakan SDKgetUser()yang dapat melakukannya untuk Anda. - PRE โ Audit cookie flags. Cookie sesi khusus harus
Secure; HttpOnly; SameSite=Lax(atauStrictuntuk alur non-OAuth). Tidak ada materi sesi dilocalStorage. - PRE โ Validate the
nextredirect param. Parameter kuerinextsetelah masuk harus dimulai dengan/dan bukan//(pengalihan terbuka ke attacker.example). Tolak apa pun di sisi server. - 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.
- POST โ Active probe. Pemeriksaan active.auth-flow dan active.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.
- 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'discript-src. Next.js menerapkan nonce secara otomatis ketika middleware menyetel header permintaanx-nonce. - PRE โ Add the legacy three.
X-Content-Type-Options: nosniff,X-Frame-Options: DENY(atau mengandalkan CSPframe-ancestorssaja),Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE โ Tighten
Referrer-Policy. Defaultstrict-origin-when-cross-originbaik untuk sebagian besar aplikasi. Jangan kirimunsafe-urlatau tanpa header sama sekali. - PRE โ Replace
Access-Control-Allow-Origin: *. Terima kasih. Ganti dengan daftar asal yang diizinkan secara eksplisit. Di mana pun*dancredentials: include, browser akan menolak permintaan tersebut โ namun hal tersebut bukan merupakan pertahanan terhadap backend yang salah dikonfigurasi. - 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'discript-src. - POST โ Run headers.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.
- PRE โ Reverse-proxy analytics where possible. PostHog, Masuk akal, Umami semuanya mendukung proksi melalui domain Anda sendiri (e.g.
/api/posthog). Hal ini menjagaconnect-srctetap pada asal yang sama dan bertahan dari pemblokir iklan. - 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-srcuntuk loader,connect-srcuntuk telemetri,frame-srcuntuk iframe,img-srcuntuk piksel). - 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.
- PRE โ Lock
package-lock.jsonin CI. Jalankannpm ci(bukannpm install) dalam build produksi. Audit dependensi dengannpm auditatau Snyk sebelum setiap rilis. - POST โ Watch discovery.tech-fingerprint. 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.
- PRE โ Disable
x-powered-by. Dinext.config.js:poweredByHeader: false. Menghapus sinyal pengungkapan versi gratis. - PRE โ Confirm middleware lives at
src/middleware.ts. Dengan tata letak direktorisrc/, Next.js mengabaikan level rootmiddleware.ts. Middleware yang salah tempat secara diam-diam gagal menyetel CSP / header autentikasi / batas kecepatan. - PRE โ Sanity-check Vercel deployment protection. Produksi harus bersifat publik; Pratinjau harus dilindungi kata sandi atau dibatasi untuk anggota organisasi. discovery.platform-vercel melaporkan permukaannya.
- 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. - DEPLOY โ Separate environments. Produksi, Pratinjau, Pengembangan. Masing-masing mempunyai rahasia tersendiri. Kunci langsung tidak pernah mencapai Pratinjau, mode pengujian Stripe tidak pernah mencapai Produksi.
- 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.
- 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.
- POST โ Confirm health-check endpoints are minimal. A
/api/healthharus kembali200 OKtanpa 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.
- Verify your production domain in FixVibe. Dashboard โ Domains โ DNS TXT atau HTTP verifikasi file. Ini membuka pemindaian ulang terjadwal, pemeriksaan aktif, dan pemantauan ancaman langsung.
- Schedule passive re-scans. Pro paket mendukung irama 3 jam; Unlimited mendukung irama 6 jam. Setiap pemindaian terjadwal yang memunculkan temuan baru akan memicu email (dan webhook jika Anda sudah mengirimkannya).
- Wire outbound webhooks. Account โ Webhooks โ tambahkan titik akhir HTTPS, berlangganan
scan.completed+finding.created+scan.active_api.first_used. Rutekan ke Slack / Discord / PagerDuty. - Enable live threat monitoring on Unlimited. Perbedaan log transparansi sertifikat, perubahan DNS, kebocoran rahasia bundel JS, daftar intelijen ancaman โ diaktifkan saat terdeteksi, bukan pada pemindaian terjadwal berikutnya.
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.
