İç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.

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.