Content Security Policy (CSP) nedir? Nonce tabanlı strict bir CSP nasıl kurulur?
Cevap
CSP, sunucunun bir HTTP başlığıyla tarayıcıya hangi kaynaklardan script, stil, görsel vb. yüklenebileceğini söylemesidir. XSS açığı olsa bile enjekte edilen script'in çalışmasını engelleyen ikinci savunma hattıdır.
Domain allowlist yerine strict CSP
script-src https://cdn.example.com gibi listeler çoğu zaman aşılabilir (izinli CDN'de JSONP veya eski kütüphaneler). Google'ın önerdiği yaklaşım nonce + strict-dynamic'tir:
Content-Security-Policy:
script-src 'nonce-R4nd0m123' 'strict-dynamic';
object-src 'none';
base-uri 'none';
frame-ancestors 'self';
report-to csp-endpoint<script nonce="R4nd0m123" src="/app.js"></script>- Nonce her HTTP cevabında yeniden üretilen rastgele bir değerdir; saldırgan bilemez.
'strict-dynamic': Nonce'lu script'in dinamik olarak yüklediği script'lere de güven aktarılır (bundler chunk'ları, analytics).- Inline
onclick="..."handler'lar veevalengellenir. frame-ancestorsclickjacking'e karşı korur (eskiX-Frame-Options'ın yerini alır).
Pratik uygulama
- Next.js'te nonce middleware/proxy içinde üretilip header'a ve
<Script nonce>'a eklenir; nonce kullanmak sayfayı dinamik render'a zorlar. Statik sitelerde nonce yerine hash ('sha256-...') kullanılır. - Önce
Content-Security-Policy-Report-Onlyile yayına alın, ihlal raporlarını toplayın, sonra zorunlu hale getirin. - Trusted Types (
require-trusted-types-for 'script') ileinnerHTMLgibi tehlikeli sink'lere sadece sanitize edilmiş değer verilmesini zorlayabilirsiniz (Chromium 83+, Safari 26+ ve 2026 başından beri Firefox; artık Baseline).
Sınırlamalar
CSP, XSS'i önlemenin yerine geçmez; escaping ve sanitization yine şarttır. 'unsafe-inline' ve 'unsafe-eval' eklemek korumanın büyük kısmını ortadan kaldırır.
İlgili Tarayıcı & Web API'leri soruları
- Bir URL'yi tarayıcıya yazıp Enter'a bastığınızda neler olur?
- Web Worker nedir? Service Worker'dan farkı nedir?
- IntersectionObserver ne işe yarar? Örnek kullanım verin.
- Tarayıcı önbelleği nasıl çalışır? Cache-Control başlıkları nelerdir?
- localStorage, sessionStorage, cookie ve IndexedDB arasındaki farklar nelerdir?
- script etiketinde async ile defer arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.