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

İçerik Güvenliği Politikası (İGP), sayfada yüklenen tüm içeriklere site sahibi tarafından güvenilmesine yardımcı olur. CSP'ler, saldırganlar tarafından yerleştirilen güvenli olmayan komut dosyalarını engelleyebildiği için siteler arası komut dosyası çalıştırma (XSS) saldırılarını azaltır. Bununla birlikte, yeterince katı değilse CSP kolayca atlayabilirsiniz. Daha fazla bilgi için Katı bir İçerik Güvenliği Politikası (İGP) ile siteler arası komut dosyası çalıştırma (XSS) sorununu azaltma makalesine göz atın. Lighthouse, ana belgede zorunlu kılınan CSP'leri toplar ve atlanabilmeleri durumunda sorunları CSP Değerlendirme Aracı'ndan bildirir.

Yaptırım modunda hiçbir CSP'nin bulunamadığını belirten Lighthouse raporu.
Yaptırım modunda hiçbir CSP'nin bulunamadığını belirten Lighthouse raporu.

Atlanamaz bir CSP için gerekli uygulamalar

İGP'nizin atlanamayacağından emin olmak için aşağıdaki uygulamaları uygulayın. CSP atlanabilirse Lighthouse yüksek önem düzeyinde bir uyarı gönderir.

CSP hedefleri XSS

XSS'yi hedeflemek için bir CSP, script-src, object-src ve base-uri yönergelerini içermelidir. CSP'de ayrıca söz dizimi hataları bulunmamalıdır.

script-src ve object-src, bir sayfayı güvenli olmayan komut dosyalarından ve güvenli olmayan eklentilerden korur. Alternatif olarak default-src, script-src ve object-src dahil olmak üzere birçok yönerge yerine geniş bir politika yapılandırmak için kullanılabilir.

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

CSP, izin verilenler listesindeki atlamaları ö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 ve komut dosyası olarak yürütülebileceği varsayımına dayanır. Ancak bu varsayım modern uygulamalar için geçerli değildir. JSONP arayüzlerini açığa çıkarma 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.

Uygulamada, uygulama yazarları bunu belli etmese de script-src izin verilenler listelerinin büyük bir kısmı XSS hatası olan bir saldırgan tarafından atlatılabilir ve komut dosyası yerleştirmeye karşı çok az koruma sağlar. Buna karşın, eş zamanlı olmayan ve karma tabanlı yaklaşımlar bu sorunlardan olumsuz etkilenmez ve daha güvenli bir politikanın benimsenmesini ve sürdürülmesini kolaylaştırır.

Örneğin, şu 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:

CSP:

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 hash değerleri kullanan komut dosyalarına tek tek izin vermeli ve "strict-dynamic" kullanmalıdır tercih edebilirsiniz.

Güvenli bir İGP için ek öneriler

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

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

Raporlama hedefi yapılandırmak, kesintilerin 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ği için her ikisinin de 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ızın olduğundan emin olun.

CSP'yi 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 bir HTTP yanıt başlığında CSP tanımlamanız gerekir. Meta etiketten önceki bir ekleme işlemi CSP'yi atlar. Ayrıca meta etiket İGP'lerinde frame-ancestors, sandbox ve raporlama desteklenmez.

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

Tüm tarayıcılar CSP nonce/hash değerlerini desteklemez. Bu nedenle, uyumlu olmayan tarayıcılar için yedek olarak unsafe-inline eklenmesi önerilir. Tarayıcı nonce/hashtag'leri destekliyorsa unsafe-inline yoksayılır.

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

Katı bir CSP geliştirme

Aşağıda, tek seferlik bir politika ile katı bir CSP kullanımı örneği verilmiştir.

CSP:

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 rastgele sayı ve strict-dynamic nedeniyle modern tarayıcılarda yoksayılır. Katı bir CSP benimseme hakkında daha fazla bilgi için Katı CSP kılavuzuna göz atın.

Lighthouse ve CSP Evaluator'ı kullanarak bir CSP'de olası atlamaları kontrol edebilirsiniz. Mevcut sayfaları bozma riski olmadan yeni bir İGP'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, CSP ihlallerini report-to ve report-uri ile yapılandırdığınız tüm raporlama hedeflerine gönderir ancak aslında CSP'yi zorunlu kılmaz.