Keamanan sisi klien pada aplikasi web memerlukan perlindungan berlapis untuk mencegah eksekusi kode tanpa izin. Salah satu mekanisme standar yang digunakan untuk membatasi pemuatan sumber daya berbahaya adalah Content Security Policy (CSP). Kebijakan ini dikirimkan oleh server web melalui header respons HTTP agar peramban dapat memvalidasi dan membatasi skrip, gaya, gambar, serta objek yang diizinkan untuk berjalan di halaman situs.
Pengenalan dan Manfaat HTTP Content Security Policy
Content Security Policy berfungsi sebagai lapisan pertahanan mendalam (defense in depth) untuk memitigasi kerentanan web, khususnya serangan Cross-Site Scripting (XSS), clickjacking, dan kebocoran lintas situs (cross-site leaks). Berdasarkan panduan dari OWASP Content Security Policy Cheat Sheet, penerapan CSP membantu mengamankan situs web melalui pembatasan beberapa elemen penting:
- Membatasi Skrip Sebaris (Inline Scripts): Mencegah peramban mengeksekusi kode JavaScript yang disuntikkan langsung di dalam dokumen HTML oleh pihak penyerang.
- Membatasi Skrip Eksternal (Remote Scripts): Memblokir pemuatan file skrip dari server atau domain asing yang tidak masuk dalam daftar terpercaya.
- Membatasi Fungsi JavaScript Tidak Aman: Memblokir eksekusi fungsi evaluasi teks-ke-JavaScript seperti fungsi eval yang rentan disalahgunakan.
- Membatasi Pengiriman Formulir (Form Submissions): Membatasi domain tujuan pengiriman data formulir HTML untuk menggagalkan skema phishing.
- Membatasi Objek dan Plugin: Mencegah pemuatan elemen Flash, Java applet, atau berkas eksekusi warisan melalui tag objek HTML.
- Perlindungan Penyematan Frame: Melindungi situs dari eksploitasi clickjacking menggunakan direktif khusus untuk menentukan siapa yang boleh menyematkan situs dalam iframe.
Meskipun CSP memberikan lapisan perlindungan tambahan yang solid, kebijakan ini tidak menggantikan praktik penulisan kode yang aman. Menurut dokumentasi keamanan Microsoft Learn, pengembang tetap perlu membersihkan input pengguna, mengelola sanitasi data dengan benar, dan kemudian menerapkan CSP sebagai lapisan pertahanan pelengkap di sisi klien.
Cara Penerapan Header CSP pada Respons HTTP Website
Pengiriman kebijakan keamanan konten ke peramban dapat dilakukan melalui beberapa metode, namun cara yang paling disarankan dan memiliki dukungan fitur terlengkap adalah melalui header respons HTTP. Header ini harus dikirimkan pada semua respons HTTP dari server web, bukan hanya pada halaman utama.
Metode Pengiriman Kebijakan
Terdapat dua format utama dalam mengirimkan direktif CSP ke peramban pengguna:
- Header HTTP Content-Security-Policy: Standar spesifikasi W3C yang didukung oleh peramban modern seperti Google Chrome, Mozilla Firefox, dan Opera. Penggunaan header ini mendukung seluruh fungsionalitas, termasuk pembatasan frame dan pencatatan laporan pelanggaran.
- Elemen Meta HTML: Alternatif yang digunakan jika konfigurasi header server tidak dapat diakses, misalnya saat berkas HTML di-deploy pada CDN statis. Dituliskan dalam format tag meta http-equiv=”Content-Security-Policy”. Kekurangan metode ini adalah tidak mendukung pembatasan frame-ancestors, sandbox, maupun pelaporan pelanggaran ke endpoint khusus.
Struktur Direktif Utama dalam CSP
Kebijakan CSP disusun oleh serangkaian direktif yang dipisahkan oleh tanda titik koma. Berikut adalah beberapa direktif penting yang sering digunakan untuk mengontrol sumber daya web:
| Direktif | Fungsi dan Cakupan |
|---|---|
| default-src | Menjadi fallback default untuk semua direktif pengambilan sumber daya yang tidak didefinisikan secara eksplisit. |
| script-src | Mengatur lokasi dan sumber domain tempat skrip JavaScript dapat dimuat dan dieksekusi. |
| style-src | Mengontrol sumber stylesheet CSS yang diizinkan untuk diterapkan pada dokumen. |
| img-src | Menentukan domain yang diizinkan untuk menyajikan gambar dan ikon. |
| connect-src | Membatasi URL tujuan untuk permintaan XMLHttpRequest, Fetch API, Beacon, dan koneksi WebSocket. |
| object-src | Mengontrol sumber untuk plugin seperti berkas Flash atau applet lainnya. Disarankan disetel ke ‘none’. |
| frame-ancestors | Menentukan URL yang diizinkan menyematkan halaman ke dalam frame, iframe, atau embed. Menggantikan header X-Frame-Options yang sudah usang. |
| form-action | Membatasi target URL tujuan yang dapat menerima data dari pengiriman formulir HTML. |
| base-uri | Membatasi URL yang dapat digunakan pada elemen dasar HTML base. |
Pendekatan Strict CSP Menggunakan Nonce dan Hash
Membangun daftar izin domain (allowlist) sering kali rumit dan rentan ditembus bila ada domain eksternal yang terkompromi. Praktik terkini merekomendasikan pendekatan Strict CSP berbasis kriptografi, yaitu:
- Pendekatan Berbasis Nonce: Server menghasilkan nilai acak unik (cryptographic nonce) untuk setiap permintaan HTTP, lalu menyertakannya di dalam header CSP dan atribut tag script HTML. Skrip sebaris tanpa nonce yang cocok akan diblokir otomatis oleh peramban.
- Pendekatan Berbasis Hash: Mengizinkan eksekusi skrip sebaris spesifik dengan mencocokkan nilai hash SHA-256 dari teks kode skrip tersebut di dalam direktif script-src. Perubahan kecil pada karakter atau spasi dalam kode akan mengubah nilai hash dan membatalkan izin eksekusi.
- Direktif strict-dynamic: Memudahkan peramban untuk mempercayai elemen DOM baru yang dibuat oleh skrip yang sudah memiliki nonce atau hash valid, tanpa perlu mendaftarkan setiap skrip turunannya secara manual.
Sebagai contoh deklarasi Strict CSP berbasis nonce, konfigurasi header dapat dituliskan sebagai berikut: Content-Security-Policy: script-src ‘nonce-RANDOM_VALUE’ ‘strict-dynamic’; object-src ‘none’; base-uri ‘none’;. Untuk skenario dasar non-strict pada situs yang hanya memuat aset lokal, format minimum yang umum digunakan adalah Content-Security-Policy: default-src ‘self’; frame-ancestors ‘self’; form-action ‘self’;.
Uji Coba Kebijakan dengan Mode Report-Only Sebelum Penerapan Penuh
Menerapkan kebijakan CSP secara langsung dalam mode pemblokiran (fail-closed) berisiko menghentikan fungsi normal situs web, seperti memblokir widget analitik, pustaka eksternal, atau skrip antarmuka penting. Untuk mencegah gangguan operasional, evaluasi kebijakan harus dilakukan terlebih dahulu menggunakan mode pelaporan khusus.
Cara Kerja Content-Security-Policy-Report-Only
Header respons Content-Security-Policy-Report-Only menginstruksikan peramban untuk menjalankan evaluasi kebijakan tanpa memblokir eksekusi sumber daya (fail-open). Setiap aktivitas yang melanggar aturan direktif akan dicatat pada konsol pengembang peramban atau dikirimkan dalam format JSON ke URL endpoint pelaporan yang ditentukan melalui direktif report-to atau report-uri.
Peramban modern mendukung penerapan header penegakan (Content-Security-Policy) dan header uji coba (Content-Security-Policy-Report-Only) secara bersamaan. Pola ini memungkinkan pengelola situs menerapkan kebijakan dasar yang longgar sambil menguji draf aturan baru yang lebih ketat.
Langkah Penerapan dan Pengujian Bertahap
Berdasarkan alur kerja pengujian sistem web, langkah migrasi dan penerapan CSP yang terstruktur mencakup tahapan berikut:
- Audit Kebutuhan Sumber Daya: Petakan seluruh domain pihak ketiga yang dibutuhkan oleh aplikasi web, seperti domain penyedia font, analitik, integrasi pembayaran, dan skrip CDN.
- Konfigurasi Mode Report-Only: Pasang header Content-Security-Policy-Report-Only dengan direktif yang mencakup dependensi yang telah dipetakan serta aturan pengetatan skrip sebaris.
- Pantau Laporan Pelanggaran: Buka berbagai halaman situs di peramban, telusuri alur navigasi pengguna, dan periksa pesan kesalahan pada konsol browser untuk mengidentifikasi berkas atau koneksi yang terblokir.
- Sesuaikan Aturan Direktif: Jika ada skrip atau aset resmi yang tercatat melanggar kebijakan, tambahkan domain spesifik tersebut ke direktif terkait (misalnya menambahkan domain font ke font-src atau domain API ke connect-src). Hindari penggunaan tanda wildcard longgar seperti tanda bintang atau skema umum https: demi menjaga integritas keamanan.
- Aktifkan Penegakan Penuh: Setelah log pelanggaran bersih dari aset yang sah, pindahkan nilai konfigurasi ke header Content-Security-Policy untuk mulai memblokir skrip yang tidak dikenal secara aktif, lalu nonaktifkan header khusus laporan.
Dengan menerapkan proses pengujian bertahap dan memilih direktif yang sesuai dengan arsitektur aplikasi, risiko injeksi skrip berbahaya pada situs web dapat ditekan secara signifikan tanpa mengganggu fungsionalitas layanan bagi pengguna akhir.
