Content Security Policy (CSP) adalah header HTTP yang digunakan untuk meningkatkan keamanan situs web dengan membatasi sumber daya (resource) yang boleh dimuat oleh browser. Mekanisme ini membantu mencegah serangan seperti Cross-Site Scripting (XSS), Clickjacking, dan berbagai bentuk code injection lainnya.
CSP bekerja dengan cara mengirimkan sekumpulan direktif (aturan) melalui header HTTP atau tag <meta>. Browser kemudian memvalidasi setiap resource yang dimuat. Jika ada konten yang tidak sesuai dengan aturan CSP, browser akan memblokirnya dan menampilkan error atau laporan pelanggaran.
Direktif CSP #
Beberapa direktif yang umum digunakan antara lain:
-
default-srcAturan default untuk berbagai resource seperti script, gambar, CSS, font, AJAX, dan lainnya. Contoh:default-src 'self' cdn.example.com; -
script-srcMengatur sumber yang diperbolehkan untuk JavaScript. Contoh:script-src 'self' js.example.com; -
connect-srcMengatur sumber untuk koneksi seperti AJAX, WebSocket, dan EventSource. Contoh:connect-src 'self'; -
sandboxMengaktifkan sandbox untuk iframe, sehingga membatasi kemampuan seperti menjalankan script atau membuka pop-up. Contoh:sandbox allow-forms allow-scripts; -
report-uri(deprecated) Menentukan endpoint untuk menerima laporan pelanggaran CSP. Digantikan olehreport-topada CSP Level 3. -
child-srcMenentukan sumber untuk worker, iframe, dan konten ter-embed lainnya. Contoh:child-src 'self'; -
form-actionMengatur tujuan (action) yang diizinkan untuk form HTML. -
frame-ancestorsMenentukan siapa saja yang boleh men-embed halaman Anda (berguna untuk mencegah clickjacking). Contoh:frame-ancestors 'none';
Nilai Sumber (Source List) #
Beberapa nilai yang dapat digunakan dalam direktif CSP:
'self': Mengizinkan resource dari domain sendiri.'none': Tidak ada sumber yang diperbolehkan.*.example.com: Mengizinkan resource dari semua subdomainexample.com.https:: Mengizinkan resource hanya melalui protokol HTTPS.'unsafe-inline'/'unsafe-eval': Mengizinkan script inline dan fungsi evaluasi dinamis (tidak direkomendasikan).- Hash / Nonce: Membatasi script inline dengan hash (
sha256,sha384,sha512) ataunonceacak untuk keamanan lebih tinggi.
Strategi Deployment CSP #
-
Mulai dengan Report-Only Gunakan header
Content-Security-Policy-Report-Onlyuntuk menguji aturan CSP tanpa memblokir konten secara langsung. -
Gunakan Endpoint Pelaporan Manfaatkan
report-to(ataureport-uriuntuk kompatibilitas lama) agar pelanggaran CSP dikirim ke server Anda untuk dianalisis. -
Hindari Direktif Berbahaya Jika memungkinkan, hindari penggunaan
'unsafe-inline'dan'unsafe-eval'untuk menjaga tingkat keamanan tetap tinggi.
Contoh Kebijakan CSP #
Berikut beberapa contoh implementasi CSP untuk berbagai jenis platform:
- WordPress
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' https: data:; connect-src 'self' https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests;- Laravel
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https:; connect-src 'self' https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests;- Static Pages
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https:; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';Konfigurasi Server #
Konfigurasi CSP di Apache #
-
Buka file konfigurasi Apache (misalnya
/etc/apache2/sites-available/000-default.confatau.htaccess). -
Pastikan modul
mod_headersaktif:sudo a2enmod headers -
Tambahkan baris berikut ke dalam blok
<VirtualHost>atau file.htaccess:Header set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:;" -
Restart Apache:
sudo systemctl restart apache2
Konfigurasi CSP di Nginx #
-
Buka file konfigurasi Nginx (misalnya
/etc/nginx/sites-available/default). -
Tambahkan baris berikut ke dalam blok
server:add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:;" always; -
Periksa konfigurasi:
sudo nginx -t -
Restart Nginx:
sudo systemctl restart nginx
Catatan:
- CSP bukan satu-satunya lapisan keamanan, jadi tetap gunakan fitur keamanan lainnya seperti HTTPS, HSTS, Secure & HttpOnly Cookies, dan sanitasi input.
- Selalu uji aturan CSP menggunakan mode Report-Only sebelum menerapkannya di lingkungan produksi.
- Perbarui aturan CSP secara berkala sesuai kebutuhan situs dan perubahan fitur.