Content Security Policy (CSP)
10 Dec 2024
Kita analogikan website itu sebuah rumah. Kalau ngga pake CSP siapa aja bisa keluar masuk bawa barang karena ngga ada sistem keamanan yang mengawasi. Nah, peran CSP ini kayak kita pake jasa satpam buat ngecek setiap orang dan barang apa yang dibawa.
"Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft, to site defacement, to malware distribution."
CSP ini kerjanya sebagai pembatas resource yang bisa di akses oleh website kita. Resource yang dimaksud contohnya script, style, gambar, font, dan lainnya.
Directive
Untuk mengimplementasikan CSP kita pake yang namanya directive yang diikuti oleh value. Tiap directive ini mengatur aspek keamanan yang berbeda dan dipisahkan dengan titik koma. Berikut beberapa directive yang sering digunakan:
default-src
- Berfungsi sebagai nilai default untuk semua directive
- Digunakan kalau ngga ada directive yang lebih spesifik
- Contoh:
default-src 'self'
hanya mengizinkan resource dari sumber yang sama dengan origin website
script-src
- Mengatur sumber resource script yang boleh di load
- Contoh:
script-src 'self' https://cdnjs.com
style-src
- Mengatur sumber resource style
- Contoh:
style-src 'self' https://fonts.googleapis.com
img-src
- Mengatur sumber resource image/gambar
- Contoh:
img-src 'self' https://images.unsplash.com
Cara Implementasi CSP
1. Menggunakan HTTP Header
CSP bisa diatur di HTTP header dari sisi server. Ini cara yang direkomendasikan karena lebih aman dan fleksibel.
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdnjs.com
Server bakalan ngirim header ini sebagai response HTTP sebelum konten website di-load oleh browser. Cara implementasinya tergantung pada web server atau framework yang kalian pakai (seperti Next.js, Express, Nginx, atau Apache).
2. Menggunakan Meta Tag
Cara kedua yaitu menggunakan meta tag <head>
di dokumen HTML. Walaupun keliatannya lebih gampang buat diimplementasi, tapi cara ini kurang fleksibel karena jadinya Hardcode, ngga bisa diubah secara dinamis.
<meta
http-equiv="Content-Security-Policy"
content="
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' https://images.unsplash.com data: blob:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;
frame-src 'self' https://www.youtube.com;
media-src 'self' https://media.example.com"
/>