- Konu sahibi
- #1
Content Security Policy (CSP), tarayıcıya bir web sayfasının hangi kaynaklardan JavaScript, stil, görsel, yazı tipi, bağlantı veya çerçeve yükleyebileceğini bildiren bir güvenlik politikasıdır. Genellikle HTTP yanıtındaki
Politika, direktiflerden oluşur. Her direktif belirli bir kaynak türünü ve izin verilen adresleri belirtir. Örneğin
Bir kaynağı yalnızca gerçekten kullanmanız gereken yerde izinli listeye ekleyin.
Aşağıdaki politika, aynı origin'deki kaynakları temel alır; nesne eklentilerini kapatır, form gönderimini siteyle sınırlar ve sayfanın başka sitelerde çerçevelenmesini engeller:
ORNEK_RASTGELE_DEGER yayımlanacak sabit değer değildir. Nonce kullanılıyorsa her HTML yanıtında kriptografik olarak rastgele yeni bir değer üretilmeli ve yalnız o yanıtta izin verilen betiğin
Bu örneği uygulamak için şu sırayı izleyin:
Başarı, sitenin gerekli işlevlerinin çalışması ve Console'da beklenmeyen CSP ihlallerinin kalmamasıdır. Bir betik engelleniyorsa bu doğrudan saldırı anlamına gelmez; eksik bir izin, yanlış origin, inline kod veya uygulamanın dış servise yaptığı meşru bir istek olabilir. Buna karşılık tanımadığınız bir alan adı görülüyorsa onu otomatik olarak izin listesine almak yerine kodun ve isteğin kaynağını araştırın.
CSP'yi yalnızca meta etiketiyle uygulamak: HTTP yanıt başlığı tercih edilmelidir. Meta yöntemi bazı yetenekleri ve yanıtın tamamını kapsamaz; güvenlik politikasını sunucu veya uygulama yanıtında üretmek daha tutarlıdır.
Her şeyi serbest bırakmak:
Nonce değerini sabit kullanmak: Nonce, sayfalar veya yanıtlar arasında değişmeyen bir parola değildir. Sabit değer, izinsiz betiklerin aynı değeri kullanabilmesine yol açabilir.
CSP'yi XSS düzeltmesi sanmak: Kullanıcı girdisini güvenli biçimde kaçışlamak, şablonları doğru kullanmak, bağımlılıkları güncellemek ve yetkilendirmeyi sunucu tarafında yapmak yine zorunludur. CSP, bu kontrollerin yanında ek bir savunma katmanıdır.
Content-Security-Policy başlığıyla gönderilir. Amaç, bir XSS açığı kullanılarak sayfaya eklenen yetkisiz kodun çalışmasını ve verilerin istenmeyen adreslere gönderilmesini zorlaştırmaktır. CSP tek başına açığı kapatmaz; hatalı giriş doğrulamasının, güncel olmayan yazılımın veya güvensiz eklentilerin yerine geçmez.CSP nasıl çalışır?
Politika, direktiflerden oluşur. Her direktif belirli bir kaynak türünü ve izin verilen adresleri belirtir. Örneğin
script-src 'self', yalnızca aynı origin üzerinden gelen betiklere izin verir. 'self' mevcut sitenin origin'ini ifade eder; alt alan adları veya üçüncü taraf servisler otomatik olarak buna dahil olmaz.default-src, ayrı kuralı olmayan fetch direktifleri için geri dönüş kaynağıdır; frame-ancestors, form-action ve base-uri gibi bütün CSP direktiflerinin varsayılanı değildir. Daha özel direktifler bu varsayılanı geçersiz kılar. Sık kullanılan bazı direktifler şunlardır:| Direktif | Kontrol ettiği kaynak | Örnek karar |
|---|---|---|
script-src | JavaScript dosyaları ve betikler | Yalnız site içi betiklere izin ver |
style-src | CSS dosyaları ve stiller | Harici stil sağlayıcısını açıkça tanımla |
img-src | Görseller | Site içi ve gereken görsel CDN'i |
connect-src | Fetch, XMLHttpRequest ve WebSocket bağlantıları | API origin'lerini sınırla |
frame-ancestors | Sayfanın başka sitelerde çerçevelenmesi | Çerçevelemeyi kapat veya izin verilen siteleri belirt |
Bir kaynağı yalnızca gerçekten kullanmanız gereken yerde izinli listeye ekleyin.
script-src *, script-src 'unsafe-inline' veya script-src 'unsafe-eval' gibi geniş izinler politikanın koruma gücünü önemli ölçüde azaltabilir.Basit ve uygulanabilir bir örnek
Aşağıdaki politika, aynı origin'deki kaynakları temel alır; nesne eklentilerini kapatır, form gönderimini siteyle sınırlar ve sayfanın başka sitelerde çerçevelenmesini engeller:
Kod:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-ORNEK_RASTGELE_DEGER'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
ORNEK_RASTGELE_DEGER yayımlanacak sabit değer değildir. Nonce kullanılıyorsa her HTML yanıtında kriptografik olarak rastgele yeni bir değer üretilmeli ve yalnız o yanıtta izin verilen betiğin
nonce niteliğiyle aynı değer kullanılmalıdır:
Kod:
<script nonce="ORNEK_RASTGELE_DEGER">
// Uygulamanın izin verdiği kısa başlatma kodu
</script>
Bu örneği uygulamak için şu sırayı izleyin:
- Sitenin gerçekten kullandığı betik, stil, görsel, yazı tipi, API ve çerçeve origin'lerini listeleyin. Kullanılmayan üçüncü tarafları listeye eklemeyin.
- Politikayı önce
Content-Security-Policy-Report-Onlybaşlığıyla gönderin. Bu kip kendi politikasını uygulayıp kaynakları engellemez; sunucuya rapor toplamak için ayrıca raporlama hedefi yapılandırılır; böylece mevcut işlevleri yanlışlıkla bozup bozmadığınızı görebilirsiniz. - Tarayıcı geliştirici araçlarındaki Console bölümünü ve uygulamanızın topladığı CSP ihlal raporlarını inceleyin. Engellenen kaynağın gerçekten gerekli olup olmadığını değerlendirin.
- Gerekli bir kaynak varsa yalnızca gerçek origin'i ilgili direktife ekleyin. Gereksiz genişletme yapmak yerine hatalı kodu kaldırmayı veya aynı kaynağın daha güvenli bir sürümünü kullanmayı tercih edin.
- Politika beklenen kaynakları kapsadığında başlığı
Content-Security-Policyolarak etkinleştirin ve normal sayfa akışını tekrar test edin.
Başarı, sitenin gerekli işlevlerinin çalışması ve Console'da beklenmeyen CSP ihlallerinin kalmamasıdır. Bir betik engelleniyorsa bu doğrudan saldırı anlamına gelmez; eksik bir izin, yanlış origin, inline kod veya uygulamanın dış servise yaptığı meşru bir istek olabilir. Buna karşılık tanımadığınız bir alan adı görülüyorsa onu otomatik olarak izin listesine almak yerine kodun ve isteğin kaynağını araştırın.
Sık yapılan hatalar
CSP'yi yalnızca meta etiketiyle uygulamak: HTTP yanıt başlığı tercih edilmelidir. Meta yöntemi bazı yetenekleri ve yanıtın tamamını kapsamaz; güvenlik politikasını sunucu veya uygulama yanıtında üretmek daha tutarlıdır.
Her şeyi serbest bırakmak:
default-src * veya sürekli 'unsafe-inline' eklemek, raporları susturabilir fakat saldırı yüzeyini genişletir. Sorunun kaynağını düzeltmek daha doğru yaklaşımdır.Nonce değerini sabit kullanmak: Nonce, sayfalar veya yanıtlar arasında değişmeyen bir parola değildir. Sabit değer, izinsiz betiklerin aynı değeri kullanabilmesine yol açabilir.
CSP'yi XSS düzeltmesi sanmak: Kullanıcı girdisini güvenli biçimde kaçışlamak, şablonları doğru kullanmak, bağımlılıkları güncellemek ve yetkilendirmeyi sunucu tarafında yapmak yine zorunludur. CSP, bu kontrollerin yanında ek bir savunma katmanıdır.