Content Security Policy ve CMP'niz: CSP ile Onayı Birlikte Çalıştırmak
Uyum Sağlaması Gereken İki Güvenlik Katmanı
Bir Content Security Policy (CSP), tarayıcıya bir sayfanın betikleri, stilleri, görselleri, çerçeveleri ve ağ isteklerini hangi kaynaklardan yükleyebileceğini söyler. Bir onay yönetim platformu ise tam tersi bir iş yapar: kullanıcının tercihine göre bu betiklerden hangilerinin çalışmasına izin verildiğine karar verir. İkisi ayrı ayrı yapılandırıldığında çatışırlar. CSP engellediği için CMP yüklenemez ya da CSP, CMP'yi ve reklam etiketlerini barındırmak için o kadar gevşetilir ki artık hiçbir şeyi korumaz.
Bu rehber, bir CMP'nin tipik olarak hangi CSP yönergelerine ihtiyaç duyduğunu, nonce'ların betik enjeksiyonuyla nasıl etkileşime girdiğini ve banner'ınızı bozmadan değişikliklerin nasıl devreye alınacağını açıklar.
Bir CMP'nin CSP'den Genellikle İhtiyacı Olanlar
Kesin gereksinimler satıcıya göre değişir; bu nedenle her zaman CMP'nizin kendi belgelerinden başlayın. Genel olarak şu yönergeleri kontrol edin:
script-src— CMP betiğinin yüklendiği alan adı ve yüklediği ek betik dosyaları.connect-src— CMP'ninfetchveya XHR ile çağırdığı uç noktalar; yapılandırma, satıcı listesi, coğrafi konum ve onay günlüğü uç noktaları gibi.style-src— stil sayfası alan adı ve CMP bir<style>öğesi enjekte ediyor ya da stil öznitelikleri ayarlıyorsa muhtemelen satır içi stiller.img-src— logolar, simgeler ve CMP'nin kullandığı izlemesiz pikseller.font-src— banner kendi yazı tiplerini yüklüyorsa.frame-src— CMP iframe kullanıyorsa, örneğin alanlar arası onay paylaşımı için.
TCF siteleri için CMP'nin sayfada __tcfapiLocator adlı bir bulucu çerçeve de oluşturduğunu unutmayın. Bu çerçeve uzak bir kaynak olmadan oluşturulur; bu yüzden normalde bir frame-src girdisi gerektirmez, ancak testlerde doğrulamaya değer.
Satır İçi Stub Sorunu
Çoğu CMP, diğer betiklerin ana CMP yüklenmeden önce çağrıları kuyruğa alabilmesi için sayfa başlığına küçük bir satır içi betik — stub — yerleştirmenizi ister. Sıkı bir CSP, açıkça izin vermediğiniz sürece satır içi betikleri engeller. Üç seçeneğiniz vardır:
- Bir nonce. Yanıt başına rastgele bir değer üretin, bunu CSP başlığına
'nonce-...'olarak ve stub'ın<script>etiketine ekleyin. Dinamik sayfalar için en esnek seçenektir. - Bir hash. Stub'ın tam içeriğinin SHA-256 hash'ini
script-srciçine ekleyin. Statik siteler için iyi çalışır, ancak stub'daki herhangi bir değişiklik, bir boşluk bile, bunu bozar. - Stub'ı kendi alan adınızda harici bir dosya olarak barındırmak ve
'self'ile kapsamak. Yeterince erken yüklenmesini sağlamak özen gerektirir.
Kestirme yol olarak 'unsafe-inline' kullanmaktan kaçının. Her satır içi betiğe izin verir ve bu, CSP'nin sağladığı korumanın büyük kısmını ortadan kaldırır.
Nonce'lar ve CMP'nin Enjekte Ettiği Betikler
Onaya kadar betikleri engelleyen bir CMP, çoğu zaman onları geri tutup sonra enjekte ederek çalışır. Nonce tabanlı bir CSP altında bu enjekte edilen betiklere de izin verilmesi gerekir. Yaygın iki yaklaşım vardır:
- Nonce yayılımı. CMP, nonce'u kendi betik etiketinden okur ve enjekte ettiği her betiğe ekler. CMP'nizin bunu destekleyip desteklemediğini kontrol edin.
'strict-dynamic'. Bu anahtar sözcük, destekleyen tarayıcılara zaten güvenilen bir betiğin yüklediği betiklere güvenmelerini söyler. Betik enjekte eden etiket yöneticileri ve CMP'lerle işi kolaylaştırır, ancak güvendiğiniz herhangi bir betiğin başkalarını yükleyebileceği anlamına da gelir; bu yüzden dikkatle güvenin.
Etiket yöneticileri aynı soruyu gündeme getirir. Reklam ve analitik etiketlerini bir etiket yöneticisi aracılığıyla yüklüyorsanız, nonce'larla ilgili belgelerini izleyin ve CMP ile etiket yöneticisinin tutarlı bir yaklaşım kullandığından emin olun.
Reklam Etiketleri CSP'yi Zorlaştırır
Programatik reklamcılık birçok alan adından betik ve çerçeve yükler ve liste talep ortakları değiştikçe değişir. Yayıncılar genellikle iki seçimden birini yapar:
- Programatik reklam içermeyen sayfalarda sıkı bir CSP, reklamların çalıştığı yerlerde daha geniş bir politika.
- Yönetilebilir kalan yönergelere, örneğin
frame-ancestors,object-src 'none'vebase-uriyönergelerine odaklanan, betik kaynaklarının daha geniş kaldığı bir politika.
Hangisi olursa olsun, bir CSP değişikliğinin banner'ı sessizce devre dışı bırakmaması için CMP yalnızca bir joker karakterle değil, açık izin listesinde yer almalıdır.
Report-Only Modu ile Devreye Alın
Önce Content-Security-Policy-Report-Only başlığını kullanın. Tarayıcı hiçbir şeyi engellemeden ihlalleri raporlar; böylece yeni bir politikanın neyi bozacağını görebilirsiniz.
- Politikayı bir raporlama uç noktasıyla report-only modunda yayına alın.
- Sayfaları temiz tarayıcı profillerinde yükleyin ve tüm onay akışından geçin: ilk ziyaret, hepsini kabul et, hepsini reddet, özel seçim, geri çekme.
- İhlal raporlarını ve tarayıcı konsolunu engellenen CMP kaynakları için inceleyin.
- Politikayı ayarlayın, ardından uygulamaya geçin.
- Gerilemeleri yakalamak için uygulamadan sonra da raporlamayı açık tutun.
CSP Çakışmasının Belirtileri
- Banner hiç görünmez ve konsol CMP betiği için bir CSP ihlali gösterir.
- Banner görünür ama stilsizdir, çünkü
style-srcCSS'ini engeller. - Tercihler kaydedilmez, çünkü
connect-srconay günlüğü çağrısını engeller. - Onaydan sonra reklamlar veya analitik hiç yüklenmez, çünkü enjekte edilen betiklerde nonce yoktur.
__tcfapitanımsızdır, çünkü satır içi stub engellenmiştir.
Önemli Çıkarımlar
- CMP'niz için
script-src,connect-src,style-src,img-srcveframe-srcyönergelerini kontrol edin. - Satır içi stub'a
'unsafe-inline'ile değil, bir nonce veya hash ile izin verin. - Onaydan sonra enjekte edilen betiklerin bir nonce aldığından veya
'strict-dynamic'ile kapsandığından emin olun. - Uygulamadan önce her onay yolunu report-only modunda test edin.
- CSP değişiklikleri onu devre dışı bırakamasın diye CMP'yi açıkça izin listesinde tutun.