// docs / security guides / cursor checklist
Cursor security checklist: 25 items before ship
Building with Cursor? Cursor's autocomplete and Agent features are exceptionally powerful β and create predictable security blind spots. This checklist targets Cursor-specific patterns: service-role key inlining, generated multi-file edits merged without review, Agent-mode terminal commands, and project rules (.cursor/rules) as your first security guardrail. 25 items across secrets, database, auth, headers, deployment, and Cursor-specific gotchas.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
Rahasia dan kunci API (5 item)
Pelengkapan otomatis Cursor dilatih pada kode sumber terbuka di mana rahasia adalah hal yang umum. Model menyarankannya secara bebas, terutama setelah upaya autentikasi gagal.
- PRE β Write security rules into your project rules. Add a rule in
.cursor/rules(Cursor docs): "Never inlineSUPABASE_SERVICE_ROLE_KEY,sk_live_*, or any server secret into client-side code. Always use server-only imports." Cursor applies project rules as context for Agent and chat. - PRE β Audit Composer-generated files. Ketika Komposer Cursor membuat seluruh file (terutama penangan autentikasi), tinjau baris demi baris. Komposer terkadang memasukkan env vars yang seharusnya tetap hanya untuk server. Cari
NEXT_PUBLIC_atau referensi langsung ke kunci layanan dalam impor komponen. - PRE β Reject auto-imports of service clients into client components. Jika Komposer mengimpor
import { supabase } from '@/lib/supabase/service'ke dalam file React, segera hapus file tersebut dan rutekan melalui titik akhir API sebagai gantinya. Impor khusus server ditandai secara eksplisit β jangan lewati. - PRE β Scan Agent-mode commits. Mode agen menjalankan perintah terminal dan dapat melakukan commit secara langsung. Audit
git log --oneline -20dangit diff HEAD~5untuk memastikan tidak ada string yang tampak rahasia yang dilakukan selama menjalankan Agen. - POST β Run Secrets in JavaScript Bundles. Pemindaian pasif pada URL yang diterapkan. Jika kunci layanan muncul di bundel JS, segera putar kunci tersebut β pelengkapan otomatis Cursor mungkin akan memasukkannya ke dalamnya.
Kontrol akses basis data (4 item)
Komposer sering kali membuat kode autentikasi yang berfungsi tetapi melewatkan RLS β momen "berhasil" membutakan orang terhadap penegakan kebijakan yang hilang.
- PRE β Make Cursor generate migrations with RLS. In your project rules: "Every
CREATE TABLE public.*migration must includeALTER TABLE ... ENABLE ROW LEVEL SECURITYand a policy per command scoped toauth.uid()." Then ask Cursor to generate the migration. - PRE β Review Composer-generated policies. Komposer terkadang menulis kebijakan tanpa memeriksa
auth.uid(). Kebijakan sepertiallow select on public.itemstanpa klausausingsangatlah luas. Memerlukan pencocokan user_id. - DEPLOY β Confirm RLS and policies are live. Open Supabase Studio and check that every table's RLS toggle is on and that each table has policies. A table with RLS on and no policies denies everything; one with
USING (true)allows everyone. - POST β Run a FixVibe scan on the deployed app. Check the Supabase Row-Level Security result: it shows any table an anonymous visitor can read with your public key.
Otentikasi dan sesi (4 item)
Cursor menghasilkan aliran autentikasi dengan cepat namun sering kali melewatkan validasi sisi server yang menjaga keamanan token.
- PRE β Ensure all auth routes use
getUser(). CarigetSession()di rute API Anda dan ganti denganawait supabase.auth.getUser().getSession()membaca cookie yang belum diverifikasi;getUser()memvalidasi dengan Supabase backend. - PRE β Check Composer auth handlers for token expiry. Token tautan ajaib memerlukan
expires_atyang didukung server. Default Supabase adalah 1 jam β jangan minta Cursor untuk menggantinya tanpa alasan yang jelas. - PRE β Audit the sign-in redirect guard. Pengalihan parameter kueri
nextsetelah masuk harus divalidasi: harus dimulai dengan/, jangan pernah//. Komposer terkadang melewatkan ini. Tambahkan secara manual jika tidak ada. - POST β Test logout server-side state destruction. Masuk, keluar, periksa cookie (DevTools β Aplikasi β Cookie). Cookie sesi harus segera dihapus. Jika tetap ada, penangan logout tidak merusak status.
HTTP header keamanan dan CSP (3 item)
Cursor jarang menghasilkan middleware secara default. Kalau tidak tanya secara eksplisit, CSP dan HSTS biasanya tidak ada.
- PRE β Demand CSP in your project rules. Add: "Generate a
src/middleware.tswith Content-Security-Policy. Use nonce for script-src, no unsafe-inline." Then ask Cursor to generate it. Without this hint, middleware is skipped. - PRE β Verify
src/middleware.tsexists. Dengan tata letak direktorisrc/, Next.js hanya mengambilsrc/middleware.ts.middleware.tstingkat root diabaikan secara diam-diam. Jika CSP tidak mendarat, periksa apakah file berada di tempat yang tepat. - POST β Run HTTP Security Headers. Laporan pemindaian pasif hilang CSP, HSTS, X-Frame-Options, X-Content-Type-Options. Buka laporan dan ikuti panduan perbaikan untuk platform penerapan Anda.
Kebersihan penempatan (5 item)
Cursor aplikasi sering kali mendarat di Vercel, yang memiliki default yang baik namun memerlukan pengerasan eksplisit untuk batas build/deploy.
- DEPLOY β Check Vercel env-var scoping. Pengaturan β Variabel Lingkungan β setiap rahasia harus dicakup hanya pada Production. Jangan pernah berbagi
sk_live_*dengan Pratinjau atau Pengembangan. - DEPLOY β Disable build-log secret echo. Jika alur kerja Tindakan
vercel.jsonatau GitHub Anda memilikiecho $SECRET, hapus alur kerja tersebut. Log build diarsipkan secara publik; rahasia dalam log dikompromikan. - DEPLOY β Use Vercel's managed secrets, not inline workflow vars. Vercel Pengaturan β Variabel Lingkungan dienkripsi saat istirahat. GitHub Rahasia tindakan lebih baik daripada tidak sama sekali, tetapi dirancang untuk CI, bukan integrasi platform penerapan.
- POST β Verify CSP nonce on the deployed preview. Buka tautan pratinjau Vercel di browser, buka DevTools β Jaringan β respons root HTML. CSP header harus ada dan menyertakan
'strict-dynamic'dengan nonce unik per permintaan. - POST β Rotate any key that ever shipped, even to Preview. Jika kunci mencapai paket produksi bahkan selama 10 menit, maka kunci tersebut telah disusupi. Segera putar.
Cursor - gotcha khusus (4 item)
Pola unik pada alur kerja Cursor yang menimbulkan risiko keamanan:
- Agent mode auto-fixes propagate old patterns. Jika Anda meminta Agen untuk "memperbaiki kesalahan autentikasi", Agen dapat membuat ulang file autentikasi yang sama beberapa kali, setiap kali memasukkan kunci layanan yang sama jika berada dalam konteks basis kode. Bersihkan dulu yang asli, lalu minta Agen memperbaikinya.
- Pengindeksan Cursor Index leaks intent. Cursor
@codebasesangat kuat tetapi jika direktori.cursorAnda pernah terekspos (S3 yang salah dikonfigurasi, riwayat git), indeks akan mengungkapkan arsitektur dan pola rahasia Anda. Pertahankan.cursorlokal. - Composer mode loses context between files. Setiap file yang dihasilkan Komposer adalah yang baru. Jika Anda memintanya untuk membuat file klien, lalu rute API, mereka mungkin menggunakan konfigurasi klien Supabase yang berbeda. Tinjau keduanya dan pastikan keduanya cocok dengan arsitektur Anda.
- Autocomplete bias toward "working" over "secure". Cursor menyarankan kode tercepat yang melewati konteks Anda saat ini. Jika pengujian Anda memiliki
NEXT_PUBLIC_SERVICE_KEY, pelengkapan otomatis akan mengingatnya dan menyarankannya kembali. Bersihkan perlengkapan pengujian sebelum membagikan kode dengan model.
Langkah selanjutnya
Setelah Anda mengunci pola khusus Cursor, periksa silang dengan general vibe coding security checklist (51 item) dan kemudian step-by-step hardening. Lihat juga Claude Code checklist jika Anda sedang mencampur alat.
