XSS saldırılarına karşı CSP'nin etkili olduğundan emin olun

İçerik Güvenliği Politikası (İGP), sayfaya yüklenen herhangi bir içeriğin site sahibi tarafından güvenilir olmasını sağlamaya yardımcı olur. CSP'ler, saldırganlar tarafından yerleştirilen güvenli olmayan komut dosyalarını engelleyebildiğinden siteler arası komut dosyası (XSS) saldırılarını azaltır. Ancak yeterince katı değilse CSP kolayca atlanabilir. Daha fazla bilgi için Katı İçerik Güvenliği Politikası (İGP) ile siteler arası komut dosyası kullanımını (XSS) azaltma konulu makaleyi inceleyin. Lighthouse, ana belgede zorunlu kılınan CSP'leri toplar ve atlanması durumunda sorunları CSP Değerlendirme Aracı'ndan bildirir.

Yaptırım modunda CSP bulunamadığına dair Lighthouse raporu uyarısı.
Yaptırım modunda herhangi bir CSP bulunamadığına dair Lighthouse raporu uyarısı.

Atlanamaz CSP için gerekli uygulamalar

CSP'nizin atlanamaması için aşağıdaki uygulamaları uygulayın. CSP atlanabilirse Lighthouse yüksek önem derecesi uyarı verir.

CSP, XSS'i hedefliyor

XSS'i hedeflemek için CSP'nin script-src, object-src ve base-uri yönergelerini içermesi gerekir. CSP'de söz dizimi hataları da bulunmamalıdır.

script-src ve object-src, bir sayfayı sırasıyla güvenli olmayan komut dosyaları ve güvenli olmayan eklentilere karşı korur. Alternatif olarak, script-src ve object-src dahil birçok yönerge yerine geniş kapsamlı bir politika yapılandırmak için default-src kullanılabilir.

base-uri, tüm göreli URL'leri (komut dosyaları gibi) saldırgan tarafından kontrol edilen bir alana yönlendirmek için kullanılabilecek yetkisiz <base> etiketlerinin yerleştirilmesini önler.

CSP, izin verilenler listesini atlamalarını önlemek için nonce veya hash değerleri kullanır

script-src için izin verilenler listesi yapılandıran bir CSP, güvenilir bir alandan gelen tüm yanıtların güvenli olduğu varsayılır ve komut dosyası olarak yürütülebilir. Ancak bu varsayım, modern uygulamalar için geçerli değildir. JSONP arayüzlerinin açığa çıkması ve AngularJS kitaplığının kopyalarını barındırma gibi bazı yaygın yararlı kalıplar, saldırganların CSP sınırlarından kaçmasına olanak tanır.

Pratikte, uygulama yazarları tarafından kolayca anlaşılmasa da script-src izin verilenler listesinin büyük çoğunluğu, XSS hatası olan bir saldırgan tarafından atlatılabilir ve komut dosyası yerleştirmeye karşı çok az koruma sağlar. Öte yandan, olumsuz temelli ve karma tabanlı yaklaşımlarda bu sorunlar yaşanmaz ve daha güvenli bir politikanın benimsenmesi ve sürdürülmesi kolaylaşır.

Örneğin bu kod, saldırgan tarafından kontrol edilen bir komut dosyası eklemek için güvenilir alanda barındırılan bir JSONP uç noktası kullanır:

İGP:

script-src https://trusted.example.com

HTML:

<script src="https://trusted.example.com/path/jsonp?callback=alert(document.domain)//"></script>

Atlanmayı önlemek için CSP, nonce veya karma kullanarak komut dosyalarına tek tek izin vermeli ve izin verilenler listesi yerine "strict-dynamic" kullanmalıdır.

Güvenli bir CSP için ek öneriler

Daha fazla güvenlik ve uyumluluk için aşağıdaki uygulamaları uygulayın. CSP önerilerden birine uymazsa Lighthouse orta önem düzeyine sahip bir uyarı verir.

İGP raporlamasını yapılandırın

Raporlama hedefi yapılandırmak, kesintiler olup olmadığının izlenmesine yardımcı olur. Raporlama hedefini, report-uri veya report-to yönergelerini kullanarak ayarlayabilirsiniz. report-to, şu anda tüm modern tarayıcılar tarafından desteklenmediğinden her ikisinin veya yalnızca report-uri kullanılması önerilir.

İGP'yi ihlal eden herhangi bir içerik varsa tarayıcı, yapılandırılan hedefe bir rapor gönderir. Bu hedefte bu raporları işleyen bir uygulamanın yapılandırılmış olduğundan emin olun.

HTTP başlığında CSP'yi tanımlama

CSP, aşağıdaki gibi bir meta etiket içinde tanımlanabilir:

<meta http-equiv="Content-Security-Policy" content="script-src 'none'">

Ancak mümkünse HTTP yanıt başlığında bir CSP tanımlamanız gerekir. Meta etiketten önce yapılan ekleme, CSP'yi atlar. Ayrıca frame-ancestors, sandbox ve raporlama meta etiket CSP'lerinde desteklenmez.

CSP'nin geriye dönük uyumlu olduğundan emin olun

Tüm tarayıcılar CSP nonce/hash'leri desteklemediğinden uyumlu olmayan tarayıcılar için yedek olarak unsafe-inline eklenmesi önerilir. Tarayıcı nonce/hash'leri destekliyorsa unsafe-inline yoksayılır.

Benzer şekilde, strict-dynamic tüm tarayıcılar tarafından desteklenmez. Uyumlu olmayan tarayıcılar için yedek olarak bir izin verilenler listesi ayarlamanız önerilir. İzin verilenler listesi, strict-dynamic destekleyen tarayıcılarda yoksayılacak.

Katı bir CSP nasıl geliştirilir?

Aşağıda, nonce tabanlı bir politikayla katı bir CSP kullanımına ilişkin örnek verilmiştir.

İGP:

script-src 'nonce-random123' 'strict-dynamic' 'unsafe-inline' https:;
object-src 'none';
base-uri 'none';
report-uri https://reporting.example.com;

HTML:

<script nonce="random123" src="https://trusted.example.com/trusted_script.js"></script>

random123, sayfa her yüklendiğinde sunucu tarafında oluşturulan base64 dizeleri olur. unsafe-inline ve https:, tek seferlik rastgele sayı ve strict-dynamic nedeniyle modern tarayıcılarda yoksayılır. Katı bir CSP benimseme hakkında daha fazla bilgi için Strict CSP rehberine göz atın.

Lighthouse ve CSP Değerlendirme Aracı'nı kullanarak bir CSP'yi olası atlamaları kontrol edebilirsiniz. Mevcut sayfaları bozma riski olmadan yeni bir CSP'yi test etmek istiyorsanız başlık adı olarak Content-Security-Policy-Report-Only kullanarak İGP'yi yalnızca rapor modunda tanımlayın. Bu işlem, report-to ve report-uri ile yapılandırdığınız tüm raporlama hedeflerine CSP ihlallerini gönderir ancak CSP'yi gerçekten zorunlu kılmaz.