// docs / security guides / ai tooling analysis
Mengapa alat coding AI meninggalkan celah keamanan
Cursor, Claude Code, Lovable, Bolt, v0, dan alat pengkodean AI serupa dikirimkan dengan cepat dan membebaskan pengembang dari kesibukan biasa. Mereka juga memiliki titik buta struktural seputar keamanan. Ini bukan kegagalan alat apa pun โ ini adalah produk sampingan dari cara LLM dilatih dan dioptimalkan. Memahami akar penyebab kesenjangan ini adalah langkah pertama untuk menutupnya.
Mengapa AI- kode yang dihasilkan berbeda dalam keamanan
AI alat pengkodean memiliki alasan struktural atas kesenjangan keamanan yang dihasilkannya. Itu bukanlah kelalaian yang sembarangan; itu adalah artefak pelatihan dan pengoptimalan yang dapat diprediksi.
- Training data skews toward "make it work." Repositori dan tutorial sumber terbuka mendominasi pelatihan LLM. Repo median OSS ditulis untuk memecahkan masalah, bukan untuk menjadi contoh penguatan keamanan. LLM mempelajari distribusi kode di alam liar, bukan distribusi kode aman.
- Autocomplete is sticky. Saat Anda menempelkan cuplikan kode yang menggunakan kunci
service_role, cuplikan tersebut akan menjadi templat untuk file berikutnya. Pelengkapan otomatis Cursor akan menyarankannya di komponen klien yang bukan tempatnya. Alat ini melakukan apa yang dioptimalkan (kecepatan) โ tetapi tidak menyadari batasan keamanan. - No long-term context or incident memory. Seorang pengembang manusia yang membakar database produksi dengan klausa WHERE yang hilang membawa pelajaran tersebut selama bertahun-tahun. LLM tidak memiliki memori episodik. Setiap file adalah awal yang baru. Alat ini tidak belajar dari bypass RLS terakhir Anda atau insiden postmortem tim Anda.
- Speed is the rewarded metric. Pengembang memilih alat ini karena pengirimannya cepat. Umpan balik latensi bersifat segera dan langsung. Umpan balik keamanan tidak ada atau tertunda โ kerentanan ditemukan dalam pemindaian FixVibe tiga minggu setelah pengiriman. LLM dioptimalkan untuk metrik yang dihargai manusia secara real-time.
- Implicit trust in platform defaults. Saat Cursor membuat aplikasi Vercel, maka default Vercel diasumsikan sudah diperkeras. Beberapa di antaranya: auto-HTTPS, cookie yang ditandatangani, perlindungan DDoS. Lainnya tidak: tidak CSP secara default, tidak HSTS, permisif CORS. Kode yang dihasilkan mewarisi asumsi platform yang tidak selalu dapat dibenarkan.
Kesenjangan 1: Rahasia dalam bundel klien
Kunci API peran layanan, token OAuth, dan kunci pribadi berakhir di bundel JavaScript yang dikirimkan ke browser. FixVibe tandai ini sebagai temuan secrets.browser-storage dan secrets.bundle-leak. Kuncinya dapat ditemukan di peta sumber, kode yang diperkecil, atau teks biasa JS.
Why it happens: Cursor menempelkan cuplikan Supabase yang menginisialisasi klien dengan peran layanan berarti kode tersebut kini berada dalam pelengkapan otomatis. Komponen React yang dihasilkan meminta "dapatkan semua item dari database" dan Cursor menyarankan impor klien layanan. Batas antara kode khusus server dan sisi klien bersifat abstrak ke LLM.
Fix: Simpan rahasia dalam variabel lingkungan yang ditandai NEXT_PUBLIC_ hanya untuk kunci publik. Kunci layanan, kunci pribadi API, dan rahasia penandatanganan harus ada di src/lib/secrets.ts dengan import 'server-only'. Gunakan tindakan server atau rute API untuk memanggil layanan sensitif, bukan komponen klien.
Kesenjangan 2: Keamanan Tingkat Baris tidak ada atau tidak lengkap
Supabase tabel dibuat tanpa mengaktifkan RLS. Firebase Aturan Firestore tidak pernah ditulis atau dibiarkan dalam mode pengujian permisif. Pengguna segera dapat membaca dan menulis setiap baris. FixVibe tandai ini sebagai baas.supabase-rls dan baas.firebase-rules.
Why it happens: RLS adalah fitur khusus Postgres. LLM yang dilatih pada Rails, Django, Laravel, dan Express melihat pemeriksaan autentikasi lapisan aplikasi sebagai norma. Mengaktifkan RLS di Supabase memerlukan pernyataan ALTER TABLE dan definisi kebijakan yang eksplisit โ pola yang kurang umum dalam data pelatihan.
Fix: Untuk Supabase, terapkan RLS dengan ALTER TABLE public.table_name ENABLE ROW LEVEL SECURITY; ALTER TABLE public.table_name FORCE ROW LEVEL SECURITY; di setiap meja. Kebijakan penulis yang mencakup baris ke pengguna atau organisasi yang diautentikasi. Untuk Firebase, jangan pernah membiarkan aturan sebagai mode pengujian default; tulis aturan eksplisit yang mencakup pengguna yang diautentikasi.
Kesenjangan 3: Kebingungan batas autentikasi
Sesi divalidasi sisi klien menggunakan getSession() (yang membaca cookie yang belum diverifikasi). Tautan ajaib tidak memiliki masa berlaku. JWTs lewati pemeriksaan aud dan exp. Penyetelan ulang kata sandi dapat dibalik. FixVibe tandai ini sebagai temuan active.auth-flow.
Why it happens: Supabase Auth, Clerk, dan layanan serupa menangani status sesi, namun API mereka memiliki mode aman dan tidak aman. getSession() nyaman tetapi belum terverifikasi. LLM lebih sering melihat kenyamanan API dibandingkan kenyamanan dalam data pelatihan. Validasi token sisi server bersifat abstrak dan memerlukan header HTTP eksplisit atau pemanggilan middleware.
Fix: Selalu gunakan supabase.auth.getUser() sisi server. Jangan pernah mempercayai getSession() pada rute yang dilindungi. Validasi JWTs pada setiap permintaan, pengecekan exp, aud, dan tanda tangan. Tetapkan masa berlaku token menjadi 1 jam untuk token akses dan gunakan token penyegaran untuk sesi yang lebih lama.
Kesenjangan 4: Header keamanan HTTP tidak ada
Tidak Content-Security-Policy, tidak X-Frame-Options, tidak Strict-Transport-Security, tidak X-Content-Type-Options. FixVibe tandai ini sebagai temuan headers.security-headers.
Why it happens: Header keamanan khusus untuk platform penerapan. Cursor menghasilkan kode untuk Next.js; pengaturan CSP memerlukan next.config.js tweak, middleware, atau vercel.json override. Ini tidak ada dalam perancah proyek default. Model mental "header untuk DevOps" masih umum.
Fix: Setel CSP di next.config.js atau middleware dengan dukungan nonce: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-...'; .... Tambahkan HSTS: Strict-Transport-Security: max-age=31536000; includeSubDomains. Gunakan header atau middleware Vercel vercel.json untuk host statis.
Kesenjangan 5: Kesalahan konfigurasi integrasi pihak ketiga
Kunci Stripe, token Penjaga, kunci Antropik API di-hardcode atau dikomit ke repo. Asal usul Analytics terlalu permisif. dependensi npm sudah usang. FixVibe pemindaian menandai ini sebagai temuan di bawah discovery.tech-fingerprint dan pemeriksa rahasia kami.
Why it happens: Integrasi disisipkan dari dokumentasi dan tutorial. LLM menyalin polanya, termasuk nilai hardcode apa pun. Disiplin env-var memerlukan disiplin eksplisit dalam CI/CD โ yang tidak dapat diterapkan oleh LLM.
Fix: Gunakan variabel lingkungan untuk setiap kredensial pihak ketiga. Simpan rahasia di platform penerapan Anda (Vercel, Netlify, Heroku, atau brankas). Audit dependensi npm dengan npm audit setiap bulan. Gunakan Dependabot atau Renovate untuk PR otomatis ketika pembaruan keamanan tersedia.
Pola remediasi
Menutup kesenjangan ini tidak memerlukan pembangunan kembali dari awal. Polanya konsisten:
- Audit: Jalankan FixVibe pada aplikasi langsung Anda. Untuk pemindaian repo, aktifkan Aplikasi FixVibe GitHub. Kumpulkan temuan โ rahasia, RLS, autentikasi, header, pihak ketiga.
- Perkuat: Perbaiki temuan dengan keyakinan tinggi. Aktifkan RLS + FORCE. Pindahkan rahasia ke variabel lingkungan. Atur CSP dan HSTS di middleware. Gunakan validasi auth sisi server. Gunakan prompt coding agent hanya di tempat perubahan kode/konfigurasi berlaku, dan ikuti langkah operator untuk perbaikan DNS atau yang dimiliki penyedia.
- Monitor: Jadwalkan pemindaian pasif harian atau pemindaian aktif mingguan pada domain terverifikasi. Siapkan webhook ke Slack. Setiap temuan penting harus memicu peringatan dalam beberapa menit setelah kapal dikirimkan.
- Tanggapi: Ketika temuan muncul, salin tindakan remediasi FixVibe yang cocok dengan pemilik perbaikan: prompt coding agent untuk pekerjaan kode/konfigurasi, atau langkah operator untuk DNS, konsol penyedia, rotasi rahasia, dan tinjauan manual. Pindai ulang untuk mengonfirmasi.
Kemana arah bidang tersebut
Memperbaiki kesenjangan ini adalah pekerjaan yang harus dilakukan tim saat ini. Selama 2-3 tahun ke depan, hal-hal baru telah bergerak: standar yang lebih baik dalam kerangka kerja dan alat (Next.js middleware auto-CSP, Supabase RLS sebagai default), umpan balik keamanan IDE-time (Cursor saran yang memperingatkan ketika Anda akan menempelkan kunci layanan ke dalam komponen klien), dan perbaikan otomatis yang digerakkan oleh MCP- (agen pengkodean Anda memiliki akses ke temuan FixVibe dan dapat memperbaikinya secara mandiri). FixVibe trek publik changelog yang celahnya ditutup terlebih dahulu.
Langkah selanjutnya
Untuk daftar periksa go/no-go sebelum peluncuran, lihat Pre-launch SaaS security checklist. Untuk panduan pengerasan langkah demi langkah dengan cuplikan kode dan pola kegagalan nyata, baca How to secure an app built with AI coding tools.
