Kesalahan konfigurasi CORS: jebakan wildcard dan reflection
Cross-Origin Resource Sharing (CORS) mengatur situs lain mana yang boleh membaca respons dari API-mu. Policy wildcard atau reflected origin bisa membuat situs mana pun mengirim request terautentikasi dan membaca hasilnya.
Apa itu
Browser memblokir pembacaan lintas-origin secara default. Header CORS melonggarkannya secara selektif. Access-Control-Allow-Origin: * membuka respons ke setiap situs.
Bug yang lebih halus adalah origin reflection: server memantulkan Origin apa pun yang dibawa request ke header allow-origin, yang secara efektif mempercayai semua orang meski tampak spesifik.
Kenapa penting
Kalau API-mu menyajikan data pengguna dan mengizinkan credentials, policy CORS yang terlalu luas memungkinkan situs jahat membaca data korban yang sedang login langsung dari API-mu.
Reflection yang dikombinasikan dengan Access-Control-Allow-Credentials: true sangat berbahaya — ia mematahkan perlindungan same-origin yang biasanya menjaga data pengguna tetap privat.
Cara memperbaiki
Validasi Origin request terhadap daftar tetap domain tepercaya, baru pantulkan kembali.
const ALLOWED = new Set(["https://app.yourdomain.com"]);
const origin = req.headers.get("origin") ?? "";
const allow = ALLOWED.has(origin) ? origin : "";
// only set the header when allow is non-emptyBrowser melarang Access-Control-Allow-Origin: * bersama credentials, jadi aplikasi kadang memantulkan origin sebagai gantinya — dan itulah celahnya. Pakai allowlist yang ketat.
Kalau sebuah endpoint tidak butuh akses lintas-origin, jangan kirim header CORS sama sekali. Buka hanya route spesifik yang benar-benar memerlukannya.
FAQ
Apakah Access-Control-Allow-Origin: * selalu buruk?
Tidak untuk resource yang benar-benar publik dan tanpa credential (mis. font publik atau API data terbuka). Ini berbahaya untuk apa pun yang terkait sesi pengguna.
Apakah CORS melindungi server-ku?
Tidak — CORS ditegakkan oleh browser, bukan server. Ia mengatur apa yang bisa dibaca JavaScript situs lain, bukan apakah sebuah request sampai ke kamu.
Apakah aplikasimu terpengaruh?
AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.
Pindai aplikasiku gratisPanduan terkait
Introspection GraphQL publik: mengapa ini masalah dan cara mematikannya
Satu query mengembalikan seluruh skema Anda. Matikan di production.
Flag cookie Secure, HttpOnly, dan SameSite
Tiga flag yang mencegah cookie sesi dicuri.
Metode HTTP berbahaya: bagaimana TRACE, PUT, dan DELETE diiklankan
Respons OPTIONS yang mendaftar TRACE atau DELETE mengungkapkan lebih dari yang seharusnya.
API key terekspos di JavaScript sisi klien
Apa pun di bundle-mu bersifat publik. Perlakukan seperti itu.