Cara Kerja CSP Web: Mekanisme Keamanan XSS & Script Injection

Content Security Policy (CSP) adalah lapisan keamanan web yang mendeteksi dan mengurangi risiko serangan jenis Cross-Site Scripting (XSS) serta injeksi data. CSP bekerja dengan membatasi sumber daya—seperti skrip, gaya (stylesheet), gambar, dan media—yang diizinkan untuk dimuat dan dieksekusi oleh browser pada halaman web tertentu.

Mekanisme inti CSP bertumpu pada pengiriman header HTTP Content-Security-Policy atau tag meta HTML dari server ke browser. Header ini berisi serangkaian arahan (directives) yang secara eksplisit mendefinisikan domain atau sumber mana yang tepercaya untuk mengeksekusi kode. Jika browser menemukan skrip atau sumber daya yang berasal dari luar daftar putih (whitelist) yang ditentukan CSP, browser akan otomatis memblokir eksekusinya dan mengirimkan laporan pelanggaran.

Arsitektur dan Direktif Utama CSP

CSP menggunakan berbagai direktif untuk mengontrol jenis aset tertentu. Konfigurasi yang tepat menentukan seberapa ketat kebijakan keamanan diterapkan pada aplikasi web.

Direktif CSP Fungsi Utama Contoh Penggunaan
default-src Fallback utama untuk semua direktif yang tidak didefinisikan secara spesifik. default-src 'self' https://trusted.com
script-src Menentukan sumber eksekusi file JavaScript yang diizinkan. script-src 'self' https://apis.google.com
style-src Mengontrol sumber stylesheet (CSS) yang boleh dimuat. style-src 'self' 'unsafe-inline'
img-src Membatasi sumber muatan gambar untuk mencegah pelacakan atau hotlinking. img-src * data:
connect-src Mengatur target koneksi jaringan via fetch, XHR, WebSocket, atau EventSource. connect-src 'self' https://api.domain.com
report-uri / report-to Mengirimkan laporan pelanggaran CSP secara otomatis ke endpoint tertentu. report-uri /csp-violation-endpoint

Implementasi Teknis Konfigurasi CSP

Penerapan CSP paling optimal dilakukan melalui konfigurasi server web (seperti Nginx atau Apache) atau melalui header HTTP di level aplikasi backend. Berikut adalah contoh implementasi header HTTP untuk mengamankan aplikasi web dari skrip eksternal liar:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; object-src 'none';

Penjelasan sintaks di atas:

  • default-src 'self': Hanya mengizinkan aset dimuat dari domain asal (origin) yang sama.
  • script-src 'self' https://trusted-cdn.com: JavaScript hanya boleh dieksekusi jika berasal dari domain sendiri atau CDN tepercaya.
  • object-src 'none': Memblokir total elemen plugin seperti Flash, Java applets, atau embed lama yang rentan dieksploitasi.

Penggunaan Nonces dan Hashes untuk Inline Script

Secara default, CSP melarang penggunaan skrip inline (seperti tag <script>...</script> langsung di dalam HTML) guna mencegah XSS. Namun, jika aplikasi membutuhkan skrip inline, pengembang dapat memanfaatkan nonce (number used once) atau hash kriptografi.

<!-- Contoh Implementasi Nonce -->
HTTP Header:
Content-Security-Policy: script-src 'self' 'nonce-rAnDoMvAlUe123'

HTML Code:
<script nonce="rAnDoMvAlUe123">
  console.log("Skrip ini diizinkan karena memiliki nonce yang valid.");
</script>

Mode Pelaporan (CSP Report-Only)

Sebelum menerapkan kebijakan ketat secara langsung ke produksi (yang berisiko merusak fungsi normal aplikasi web), pengembang wajib menggunakan mode Content-Security-Policy-Report-Only.

Dalam mode ini, browser tidak akan memblokir sumber daya yang melanggar kebijakan, melainkan hanya mengirimkan laporan JSON berisi detail pelanggaran ke URL yang ditentukan pada direktif report-uri. Hal ini memungkinkan audit keamanan secara bertahap tanpa mengganggu pengalaman pengguna akhir.

Troubleshooting dan Tantangan Implementasi Lapangan

Kendala utama dalam penerapan CSP adalah pemblokiran aset sah akibat kebijakan yang terlalu ketat (over-restrictive). Langkah mitigasi di lapangan meliputi:

  • Gunakan ekstensi browser atau console Developer Tools untuk memantau error CSP secara real-time.
  • Hindari penggunaan 'unsafe-inline' dan 'unsafe-eval' pada direktif script-src karena akan membuka celah keamanan XSS kembali.
  • Lakukan pengujian menyeluruh pada staging environment menggunakan mode Report-Only sebelum menerapkannya di live server.