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

İçerik Güvenliği Politikası (İGP), sayfaya yüklenen tüm içeriklerin site sahibi tarafından güvenilir olmasını sağlar. İGP'ler, saldırganlar tarafından yerleştirilen güvenli olmayan komut dosyalarını engelleyebildiğinden siteler arası komut dosyası çalıştırma (XSS) saldırılarını azaltır. Ancak yeterince katı değilse CSP kolayca atlanabilir. Daha fazla bilgi için Katı bir İçerik Güvenliği Politikası (İGP) ile siteler arası komut dosyası çalıştırma (XSS) saldırılarını azaltma başlıklı makaleyi inceleyin. Lighthouse, ana belgede uygulanan CSP'leri toplar ve atlanabilirlerse CSP Değerlendirici'den sorunları bildirir.

Zorunlu modda hiç CSP bulunmadığına dair Lighthouse raporu uyarısı.
Lighthouse raporu, zorunlu modda hiç CSP bulunmadığını uyarıyor.

Atlanılamayacak bir CSP için gerekli uygulamalar

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

CSP, XSS'yi hedefler

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

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

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

CSP, izin verilenler listesi atlamalarını önlemek için tek seferlik değerler veya karma oluşturma işlemleri kullanır

script-src için izin verilenler listesi yapılandıran bir İGP, güvenilir bir alandan gelen tüm yanıtların güvenli olduğu ve komut dosyası olarak yürütülebileceği varsayımını temel alır. Ancak bu varsayım modern uygulamalar için geçerli değildir. JSONP arayüzlerini gösterme ve AngularJS kitaplığının kopyalarını barındırma gibi yaygın ve zararsız bazı kalıplar, saldırganların CSP'nin sınırlarından kaçmasına olanak tanır.

Uygulama yazarları tarafından fark edilmese de pratikte script-src izin verilenler listelerinin çoğu, XSS hatası olan bir saldırgan tarafından atlatılabilir ve komut dosyası eklemeye karşı çok az koruma sağlar. Buna karşılık, tek seferlik anahtar tabanlı ve karma oluşturma tabanlı yaklaşımlar bu sorunlardan etkilenmez ve daha güvenli bir politikayı benimsemeyi ve sürdürmeyi kolaylaştırır.

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

İGP:

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

HTML:

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

CSP'lerin atlatılmasını önlemek için komut dosyalarına nonce veya hash değerleri kullanarak ayrı ayrı izin vermesi ve izin verilenler listesi yerine "strict-dynamic" değerini kullanması gerekir.

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 derecesinde bir uyarı verir.

CSP raporlamasını yapılandırma

Raporlama hedefi yapılandırmak, kesintileri izlemenize yardımcı olur. report-uri veya report-to yönergelerini kullanarak raporlama hedefini ayarlayabilirsiniz. report-to şu anda tüm modern tarayıcılar tarafından desteklenmemektedir. Bu nedenle, her ikisini birden veya yalnızca report-uri'ü kullanmanız önerilir.

Herhangi bir içerik CSP'yi ihlal ederse tarayıcı, yapılandırılmış hedefe bir rapor gönderir. Bu hedefte bu raporları işleyen bir uygulama yapılandırdığınızdan emin olun.

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

CSP, aşağıdaki gibi bir meta etikette tanımlanabilir:

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

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

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

CSP nonce/hash'lerini tüm tarayıcılar desteklemez. Bu nedenle, uyumlu olmayan tarayıcılar için yedek olarak unsafe-inline eklemeniz ö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 izin verilenler listesi ayarlanması önerilir. İzin verilenler listesi, strict-dynamic'ü destekleyen tarayıcılarda yoksayılır.

Katı bir CSP geliştirme

Aşağıda, tek seferlik sayı tabanlı bir politikayla katı CSP kullanımı örneği 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 herhangi bir base64 dizesi olur. unsafe-inline ve https:, tek seferlik sayı ve strict-dynamic nedeniyle modern tarayıcılarda yoksayılır. Sıkı CSP'yi benimseme hakkında daha fazla bilgi için Sıkı CSP kılavuzuna göz atın.

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