Web'in güvenlik modeli,
aynı kaynak politikasına tabidir. Kodlayın
https://mybank.com
adresinden yalnızca https://mybank.com
öğesine erişilebilir
ve https://evil.example.com
erişimine kesinlikle hiçbir zaman izin verilmemelidir.
Her kaynak web'in geri kalanından izole saklanarak geliştiricilere güvenli
bir sandbox oyun vardır. Teoride, bu mükemmel bir parlaklık. İçinde
bu şekilde, saldırganlar sistemi tersine çevirmenin zekice yöntemlerini bulmuşlardır.
Siteler arası komut dosyası çalıştırma (XSS) aynı kaynak politikasını atlatmak için bir siteyi kandırarak kötü amaçlı kodu istenen içerikle birlikte sunarak. Bu, muazzam bir Tarayıcılar bir sayfada görünen tüm koda doğru kodlu bir kod yerine yasal olarak söz konusu sayfanın güvenlik kaynağının bir parçası değildir. İlgili içeriği oluşturmak için kullanılan XSS hakkında yardımcı kısa bilgiler saldırganların kullanabileceği yöntemlerin eski ancak temsili bir kesitidir kötü amaçlı kod yerleştirerek bu güveni ihlal edebilir. Bir saldırgan başarıyla herhangi bir kod eklediğinde, hemen hemen oyun biter. Kullanıcı oturumu verileri güvenliği ihlal edildiği ve gizli tutulması gereken bilgilerin Kötü'ye sızdırıldığı Arkadaşlar. Mümkünse bunu önlemek isteriz.
Bu genel bakışta, riski önemli ölçüde azaltabilecek bir savunmayı modern tarayıcılardaki XSS saldırılarının etkisi: İçerik Güvenliği Politikası (İGP).
Özet
- İzin verilen ve verilmeyen içerikler hakkında müşteriye bilgi vermek için izin verilenler listelerini kullanın.
- Hangi yönergelerin kullanılabileceğini öğrenin.
- Kullandıkları anahtar kelimeleri öğrenin.
- Satır içi kod ve
eval()
zararlı kabul edilir. - Politika ihlallerini zorunlu kılmadan önce sunucunuza bildirin.
Kaynak izin verilenler listeleri
XSS saldırıları tarafından kötüye kullanılan sorun, tarayıcının ayırt edememesidir.
veya kullandığınız komut dosyasıyla
Bir üçüncü tarafça kötü amaçlı olarak yerleştirilmişse. Örneğin, web sitenizin URL'sindeki Google +1 düğmesi
sayfasının alt kısmındaki kod ile yüklenir ve şuradan kod yürütür:
Bu sayfanın kaynağı bağlamında https://apis.google.com/js/plusone.js
. Biz
tarayıcının bu kodu kendi başına anlamasını bekleyemeyiz.
apis.google.com
tarafından sağlanan kod muhteşem, apis.evil.example.com
tarafından sağlanan kod ise
değildir. Tarayıcı, sayfadaki kodları memnuniyetle indirir ve yürütür
isteklerini kaynak gösterir.
İGP, bir sunucunun sağladığı her şeye körü körüne güvenmek yerine
Content-Security-Policy
HTTP üstbilgisi, izin verilenler listesi oluşturmanıza olanak tanır
tarayıcı tarafından yalnızca güvenilir içerik kaynaklarını görüntüler ve tarayıcıya sadece bazı içerikleri
bu kaynakları kullanabilirsiniz. Saldırgan, içeride bir delik olsa bile,
komut dosyası, izin verilenler listesiyle eşleşmediğinden
yürütüldü.
Geçerli kod sunma konusunda apis.google.com
uygulamasına güvendiğimiz için
aynısını yapmak istiyorsanız komut dosyasının yalnızca çalıştırılmasına izin veren
aşağıdaki iki kaynaktan birinden gelir:
Content-Security-Policy: script-src 'self' https://apis.google.com
Basit, değil mi? Tahmin edebileceğiniz gibi script-src
,
belirli bir sayfa için komut dosyasıyla ilgili ayrıcalıkları kontrol eder. Belirli
Geçerli bir komut dosyası kaynağı olarak 'self'
ve olarak https://apis.google.com
başka bir tane. Tarayıcı, JavaScript'i düzgün bir şekilde şuradan indirir ve yürütür:
apis.google.com
hem HTTPS üzerinden hem de geçerli sayfanın kaynağından.
Bu politika tanımlandığında, tarayıcı sadece komut dosyası yükleme. Zeki bir saldırgan, bir hata mesajı alırlar. Bunun yerine, daha başarılı sonuçlar elde ediyor.
Politika, çok çeşitli kaynaklar için geçerlidir
Komut dosyası kaynakları en bariz güvenlik riskleri olsa da CSP, kullanıcılara
kaynaklar üzerinde oldukça ayrıntılı denetime imkan veren bir dizi politika yönergesi
izin verildiği anlamına gelir. Daha önce script-src
görmüştünüz, yani konsept
net olmalıdır.
Geri kalan kaynak yönergelerinin üzerinden geçelim. Aşağıdaki liste , yönergelerin 2. düzey durumundaki durumunu temsil eder. 3. düzey spesifikasyon yayınlanmış olup, büyük ölçüde uygulanmamıştır izin verir.
base-uri
, bir sayfanın<base>
öğesinde görünebilecek URL'leri kısıtlar.child-src
, çalışanların ve yerleştirilmiş çerçeve içeriklerinin URL'lerini listeler. Örneğin, örnek:child-src https://youtube.com
, şuradan videoların yerleştirilmesini etkinleştirir: YouTube'da yayınlanır.connect-src
, bağlanabileceğiniz kaynakları sınırlar (XHR, WebSockets ve EventSource).font-src
, web yazı tipleri sunabilen kaynakları belirtir. Google'ın web yazı tiplerifont-src https://themes.googleusercontent.com
aracılığıyla etkinleştirilebilir.form-action
,<form>
etiketlerinden gönderim için geçerli uç noktaları listeler.frame-ancestors
, geçerli sayfayı yerleştirebilecek kaynakları belirtir. Bu yönerge<frame>
,<iframe>
,<embed>
ve<applet>
etiketleri için geçerlidir. Bu yönerge<meta>
etiketlerinde kullanılamaz ve yalnızca HTML olmayan öğeler için geçerlidir kaynaklar.frame-src
2. düzeyde kullanımdan kaldırıldı ancak 3. düzeyde geri yüklendi. Değilse eskisi gibichild-src
düzeyine düştüğünü görebilirsiniz.img-src
, görüntülerin yüklenebileceği kaynakları tanımlar.media-src
, video ve ses yayınlamasına izin verilen kaynakları kısıtlar.object-src
, Flash ve diğer eklentiler üzerinde kontrol olanağı sağlar.plugin-types
, bir sayfanın çağırabileceği eklenti türlerini sınırlar.report-uri
, bir içerik güvenliği politikasının ihlal edilmesi. Bu yönerge<meta>
içinde kullanılamaz etiketleri arasında yer alır.style-src
,script-src
'in stil sayfalarında eşdeğeridir.upgrade-insecure-requests
, kullanıcı aracılarına URL şemalarını yeniden yazmalarını söyler. HTTP'yi HTTPS olarak değiştiriyoruz. Bu yönerge, çok sayıda eski URL'leri kontrol edin.worker-src
, olabilecek URL'leri kısıtlayan bir İGP 3. Düzey yönergesidir. çalışan, paylaşılan çalışan veya hizmet çalışanı olarak yüklenmelidir. Bu, Temmuz 2017 itibarıyla yönergesinde sınırlı uygulamalar için geçerli olduğundan emin olun.
Varsayılan olarak, yönergeler geniş kapsamlıdır. Bir
yönergesi varsa, bu yönerge font-src
olarak varsayılan olarak
geçerli kaynak olarak *
belirtebilirsiniz (örneğin,
herhangi bir yerde, kısıtlama olmaksızın).
Bir default-src
belirterek bu varsayılan davranışı geçersiz kılabilirsiniz.
yönergesini inceleyin. Bu yönerge, çoğu doküman için varsayılanları tanımlar
yönergelerdir. Bu durum genellikle
şununla biter: -src
. default-src
, https://example.com
değerine ayarlanırsa işlem başarısız olursa
bir font-src
yönergesi belirtmek için yazı tiplerini
https://example.com
ve başka hiçbir yer. Yalnızca script-src
Bu, resimlerin, yazı tiplerinin ve benzeri öğelerin
tüm kaynaklar.
Aşağıdaki yönergeler yedek olarak default-src
kullanmaz. Bunu unutmayın
bunların ayarlanmaması her şeye izin vermekle aynı şeydir.
base-uri
form-action
frame-ancestors
plugin-types
report-uri
sandbox
Bu yönergelerden işletmeniz için uygun olabileceği kadar çok veya az sayıda
HTTP başlığında listeleme, ayrı ayrı
Yönergeler için noktalı virgül kullanın. Tümünü listelediğinizden emin olun
tek yönergede belirli bir türdeki gerekli kaynakları içerir. Şunu yazdıysanız:
script-src https://host1.com; script-src https://host2.com
gibi bir şey
ikinci yönerge yok sayılır. Aşağıdakine benzer bir
her iki kaynağı da geçerli olarak doğru bir şekilde belirtin:
script-src https://host1.com https://host2.com
Örneğin, tüm kaynaklarını bir
(mesela https://cdn.example.net
) ve güvenli bir web sitesi için
çerçeveli içeriğe veya eklentiye ihtiyaç duymuyorsa politikanız
örneğin:
Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'
Uygulama ayrıntıları
Çeşitli düzeylerde X-WebKit-CSP
ve X-Content-Security-Policy
başlıkları göreceksiniz.
eğiticiler hazırladı. Bundan sonra, bu ön ekleri yoksaymanız gerekir
başlıklar. Modern tarayıcılar (IE hariç)
Content-Security-Policy
üstbilgisi. Kullanmanız gereken başlık budur.
Politika, kullandığınız başlıktan bağımsız olarak sayfa bazında tanımlanır: HTTP üstbilgisini istediğiniz her yanıtla birlikte göndermeniz gerekir emin olmanız gerekir. Bu size çok fazla esneklik sağlar. Çünkü bu alanlarda bu politikaya uymasını sağlayın. Belki de yalnızca diğer sayfalarda +1 düğmesi bulunur, diğerlerinde ise yoktur: Bu reklamların yalnızca gerektiğinde yüklenecek düğme kodu.
Her yönergedeki kaynak listesi esnektir. Kaynakları belirtmek için
şema (data:
, https:
) veya yalnızca ana makine adına göre belirli bir aralıkta
(ilgili ana makinedeki herhangi bir kaynakla eşleşen example.com
: herhangi bir şema, herhangi bir bağlantı noktası)
tam nitelikli URI (yalnızca HTTPS ile eşleşen https://example.com:443
,
example.com
ve yalnızca bağlantı noktası 443). Joker karakterler sadece bir şema olarak kabul edilir,
bir bağlantı noktası veya ana makine adının en soldaki konumunda: *://*.example.com:*
example.com
öğesinin tüm alt alan adlarını eşleştirir (ancak example.com
için değil)
herhangi bir bağlantı noktasından
seçebilirsiniz.
Kaynak liste dört anahtar kelime de kabul eder:
'none'
, bekleyebileceğiniz gibi hiçbir şeyle eşleşmiyor.'self'
mevcut kaynakla eşleşiyor ancak alt alan adıyla eşleşmiyor.'unsafe-inline'
, satır içi JavaScript ve CSS'ye izin verir. (Bu konuya daha ayrıntılı değineceğiz.)'unsafe-eval'
,eval
gibi metin-JavaScript mekanizmalarına izin verir. ( dikkate alın.)
Bu anahtar kelimeler için tek tırnak işareti gerekir. Örneğin, script-src 'self'
(tırnak işaretleriyle birlikte)
mevcut ana makineden JavaScript'in yürütülmesine yetki verir; script-src self
(tırnak işareti olmadan) "self
" adlı bir sunucudan JavaScript'e izin verir (ve şuradan değil:
ana makine adı ile) geliyor. Bu da büyük olasılıkla kastettiğiniz şey değil.
Korumalı alana alma
Bahsetmeye değer bir yönerge daha var: sandbox
. Biraz önce
yapılan işlemlere kısıtlama getirdiğinden, daha sonra incelediğimiz
sayfa, sayfanın yüklenebileceği kaynaklar yerine alabilir. Öğe
sandbox
yönergesi mevcut, sayfa yüklenmiş gibi değerlendiriliyor
sandbox
özelliğine sahip bir <iframe>
içinde. Bu rapor,
etkiler: sayfayı benzersiz bir kaynağa zorlamak ve formu
ve diğer işlemler gibi. Bu, bu makalenin kapsamı dışındadır ancak
geçerli korumalı alan özellikleriyle ilgili tüm ayrıntıları
"Korumalı alan" bölümüne bakın.
Meta etiket
İGP'nin tercih edilen yayınlanma mekanizması bir HTTP başlığıdır. Ancak bazı durumlarda
doğrudan işaretlemeden bir sayfada politika ayarlamak için kullanılır. Bunu,<meta>
bir http-equiv
özelliği:
<meta
http-equiv="Content-Security-Policy"
content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'"
/>
Bu kod frame-ancestors
, report-uri
veya sandbox
için kullanılamaz.
Satır içi kod zararlı kabul edildi
CSP'nin izin verilenler listesindeki kaynakları temel aldığı açıkça belirtilmelidir. Bu,
tarayıcıya belirli kaynak gruplarını işlemesi talimatını vermenin açık bir yolu
geri kalanını reddetmelidir. Kaynağa dayalı izin verilenler listeleri de
Ancak XSS saldırılarının ortaya çıkardığı en büyük tehdidi ortadan kaldırın: satır içi komut dosyası yerleştirme.
Bir saldırgan, doğrudan bazı kötü amaçlı yazılımlar içeren bir komut dosyası etiketi yerleştirebiliyorsa
yük (<script>sendMyDataToEvilDotCom();</script>
),
Tarayıcının, kendisini yasal sayfalardan ayırt edecek mekanizma yok,
satır içi komut dosyası etiketi. CSP, satır içi komut dosyasını tamamen yasaklayarak bu sorunu çözer:
emin olmanın tek yolu bu.
Bu yasak yalnızca doğrudan script
etiketlerine yerleştirilmiş komut dosyalarını değil, aynı zamanda
satır içi etkinlik işleyiciler ve javascript:
URL. Şu dosyanın içeriğini taşımanız gerekir:
script
etiketlerini harici bir dosyaya ekleyin ve javascript:
URL ile <a ... onclick="[JAVASCRIPT]">
URL'sini uygun addEventListener()
çağrılarıyla değiştirin. Örneğin,
şu cümleyi şuradan yeniden yazabilirsiniz:
<script>
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
</script>
<button onclick="doAmazingThings();">Am I amazing?</button>
şuna benzer bir şekilde değiştirebilirsiniz:
<!-- amazing.html -->
<script src="amazing.js"></script>
<button id="amazing">Am I amazing?</button>
<div style="clear:both;"></div>
// amazing.js
function doAmazingThings() {
alert('YOU AM AMAZING!');
}
document.addEventListener('DOMContentLoaded', function () {
document.getElementById('amazing').addEventListener('click', doAmazingThings);
});
Yeniden yazılan kodun, sorunsuz bir şekilde çalışmasının ötesinde, pek çok avantajı vardır CSP; CSP kullanımınızdan bağımsız olarak bu zaten en iyi uygulamadır. Satır içi JavaScript, yapı ve davranışların karışmamasını sağlar. Harici kaynakların tarayıcı tarafından önbelleğe alınması daha kolaydır ve harici derlemeye ve sadeleştirmeye elverişlidir. Daha iyi yazarsınız kodunu eklemeniz gerekir.
Satır içi stil de aynı şekilde ele alınır: hem style
özelliği hem de style
harici stil sayfalarında birleştirip harici bir stile karşı korumak için
şaşırtıcı derecede zeki
veri hırsızlığı yöntemlerinden bahsedeceğiz.
Satır içi komut dosyanız ve stilinizin olması gerekiyorsa bunları etkinleştirebilirsiniz
script-src
veya style-src
öğesinde izin verilen kaynak olarak 'unsafe-inline'
ekleyerek
yönergesini inceleyin. Sıfır veya karma değeri de kullanabilirsiniz (aşağıya bakın), ancak kullanmamanız gerekir.
Satır içi komut dosyasını yasaklamak, CSP'nin sağladığı en büyük güvenlik kazancıdır ve
satır içi stili yasaklamak da uygulamanızı güçlendirir. Bu biraz
tüm kodu taşıdıktan sonra her şeyin doğru çalışmasını sağlamak için en baştan
ancak bu, elde etmeye değecek bir dengedir.
Kesinlikle kullanmanız gerekiyorsa
CSP Düzey 2, şunları yapmanıza olanak tanıyarak satır içi komut dosyaları için geriye dönük uyumluluk sunar: belirli satır içi komut dosyalarını izin verilenler listesine eklemek için kriptografik bir tek seferlik rastgele sayı (sayısal veya karma oluşturma işlemi uygulanır. Bu yöntem kullanışsız olsa da, hızlı bir şekilde büyümenizi sağlar.
Tek seferlik rastgele sayı kullanmak için komut dosyası etiketinize bir nonce özelliği verin. Değeri birle eşleşmelidir güvenilir kaynaklar listesindedir. Örneğin:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
// Some inline code I can't remove yet, but need to asap.
</script>
Şimdi, tek seferlik rastgele değerini nonce-
anahtar kelimesine eklenen script-src
yönergenize ekleyin.
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Noce'ların her sayfa isteği için yeniden oluşturulması gerektiğini ve bu tahmin edilemez.
Karmalar da hemen hemen aynı şekilde çalışır. Komut dosyası etiketine kod eklemek yerine,
komut dosyasının bir SHA karmasını oluşturun ve bunu script-src
yönergesine ekleyin.
Örneğin, sayfanızda şunları içerdiğini varsayalım:
<script>
alert('Hello, world.');
</script>
Politikanız şunları içerecektir:
Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='
Burada dikkat edilmesi gereken birkaç nokta var. sha*-
öneki algoritmayı belirtir
hesaplamanız gerekir. Yukarıdaki örnekte sha256-
kullanılmıştır. CSP ayrıca
sha384-
ve sha512-
desteklenir. Karma oluşturma işlemi sırasında
<script>
etiket. Ayrıca, büyük harf ve boşluk kullanımı da (baştaki veya
boşluk eklenir.
SHA karmaları oluşturmayla ilgili bir Google araması, sizi izin verir. Chrome 40 veya sonraki bir sürümü kullanarak Geliştirici Araçları'nı açtıktan sonra sayfanızı yeniden yükleyin. Konsol sekmesi, doğru sha256 karma değeri oluşturun.
Eval da
Bir saldırgan doğrudan komut dosyası yerleştiremediğinde bile,
uygulamanızın, aksi takdirde durağan metinleri yürütülebilir JavaScript'e dönüştürmesine
onlar adına yürütüyorum. eval()
, yeni
Function() , setTimeout([string], ...)
ve
setInterval([string], ...)
, araya yerleştirilen tüm vektörlerdir
metni beklenmedik şekilde kötü amaçlı bir şey yürütebilir. CSP'nin varsayılan değeri
tüm bu vektörleri tamamen engellemek olacaktır.
Bunun uygulama derleme şekliniz üzerinde birden fazla etkisi vardır:
JSON.parse
eval
. Yerel JSON işlemleri şurada kullanılabilir: IE8'den beri her tarayıcıda ve tamamen güvenlidir.- Şu anda yaptığınız tüm
setTimeout
veyasetInterval
çağrılarını yeniden yazın satır içi işlevler kullanın. Örneğin:
setTimeout("document.querySelector('a').style.display = 'none';", 10);
şu şekilde yazılması daha iyi olurdu:
setTimeout(function () {
document.querySelector('a').style.display = 'none';
}, 10);
- Çalışma zamanında satır içi şablon oluşturmaktan kaçının: Birçok şablon oluşturma kitaplığı, çalışma zamanında şablon oluşturma işlemini hızlandırmak için
new Function()
hizmetini serbest bir şekilde kullanır. Bu bir oldukça kullanışlı bir uygulamadır ancak kötü amaçlı metinlerin değerlendirilmesi. Bazı çerçeveler kullanıma hazır CSP'yi destekler.eval
yokluğunda sağlam bir ayrıştırıcıya başvurur. AngularJS'nin ng-csp yönergesi bunun iyi bir örneği.
Ancak çok sayıda kullanıcıya hitap eden şablon bir dil kullanmak daha iyi bir seçimdir.
önceden derleme (Gidiş çubukları yapar,
örneğine bakın). Şablonlarınızı önceden derleyerek daha iyi bir kullanıcı deneyimi
en hızlı çalışma zamanı uygulamasından daha hızlıdır ve aynı zamanda daha güvenlidir. Değer
metin-JavaScript kardeşleri uygulamanız için gerekliyse, bunu
'unsafe-eval'
öğesini script-src
içinde izin verilen kaynak olarak ekleyerek bunları etkinleştirin
yönergesi var, ancak bunu kesinlikle önermiyoruz. Yürütme yetkisini yasaklama
dizeler, saldırganların yetkisiz erişim sağlamasını çok daha zorlaştırır.
bir kod snippet'i eklemeniz gerekir.
Raporlama
CSP'nin güvenilmeyen kaynakları istemci tarafında engelleyebilmesi,
ancak yine de bununla ilgili birtakım bildirimler ya da
yardımcı olan tüm hataları tespit edebilmeniz için sunucuya geri gönderilir.
her şeyden en iyi şekilde bahsedeceğiz. Bu amaca yönelik olarak,
Tarayıcıyı POST
için JSON biçiminde ihlal raporları bir konuma gönder
report-uri
yönergesinde belirtilir.
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
Bu raporlar aşağıdaki gibi görünür:
{
"csp-report": {
"document-uri": "http://example.org/page.html",
"referrer": "http://evil.example.com/",
"blocked-uri": "http://evil.example.com/evil.js",
"violated-directive": "script-src 'self' https://apis.google.com",
"original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"
}
}
Bu rapor, aradığınızı bulmanıza yardımcı olacak
ihlalin gerçekleştiği sayfa da dahil olmak üzere ihlalin nedeni
gerçekleşen (document-uri
), söz konusu sayfanın yönlendireni (HTTP'den farklı olarak
anahtarın yanlış yazılmamış olması),
sayfasının politikası (blocked-uri
), ihlal ettiği ilgili yönerge
(violated-directive
) ve sayfanın tam politikası (original-policy
).
Yalnızca Rapor
CSP'yi kullanmaya yeni başlıyorsanız mevcut değerlendirmeyi göz önünde bulundurmanız
uygulamanızın durumunu kontrol edin.
Eksiksiz bir dağıtıma giden yolda bir adım olarak, tarayıcıdan
politikaların uygulanması, ihlallerin bildirilmesi ve kısıtlamaların uygulanmaması. Şunun yerine:
bir Content-Security-Policy
üstbilgisi gönderiyor,
Content-Security-Policy-Report-Only
üstbilgisi.
Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
Yalnızca rapor modunda belirtilen politika, kısıtlanmış kaynakları engellemez ancak ihlal raporlarını belirttiğiniz konuma gönderir. İsterseniz her iki üstbilgi de kullanılarak bir politikayı zorunlu kılarken diğerini izlemesi gerekir. Bu harika bir uygulamanızın İGP'sindeki değişikliklerin etkisini değerlendirme yöntemi: etkinleştirin ihlal raporlarını izleyerek ve sitenizde tespit edilen veya aç; memnun olduğunuzda, yeni politikayı uygulamaya başlayın.
Gerçek Dünyada Kullanım
CSP 1; Chrome, Safari ve Firefox'ta oldukça kullanılabilir ancak IE 10'da desteklenir. Şunları yapabilirsiniz: ayrıntıları caniuse.com'da görüntüleyebilirsiniz. CSP Düzey 2, Chrome'da kullanılabilir. 40 sürümünü kullanın. Twitter ve Facebook gibi büyük siteler başlığı dağıttı (Twitter'ın örnek olayı okunmaya değer) ve standart henüz çok hazır kendi sitelerinizde dağıtmaya başlamanızı sağlar.
Uygulamanız için politika oluşturmanın ilk adımı, kaynakları seçin. Paydaşların ekipteki herkesi uygulamanızda bir araya getirildiğinden emin olmak istiyorsanız gereksinimlerini karşılayın. Birkaç yaygın kullanım alanından bahsedelim ve en iyi şekilde destek verebilmek için CSP'nin koruyucu sınırları dahilinde çalışmalıdır.
1. kullanım alanı: Sosyal medya widget'ları
Google'ın +1 düğmesi
https://apis.google.com
kaynağından bir komut dosyası içerir ve şuradan bir<iframe>
yerleştirir:https://plusone.google.com
. Bu iki politikanın da başlangıç noktalarından birini seçin. Minimum politikascript-src https://apis.google.com; child-src https://plusone.google.com
olmalıdır. Ayrıca şunlara da ihtiyacınız vardır: Google'ın sağladığı JavaScript snippet'inin kod snippet'inin olması gerekir.frame-src
kullanan 1. düzey bir politikanız varsa 2. Seviye, bu ayarıchild-src
olarak değiştirmenizi gerektiriyordu. Bu işlem artık gerekli değil inceleyebilirsiniz.Facebook'un Beğen düğmesi çeşitli uygulama seçeneklerine sahiptir. Sürekli iyileştirmeyle ilgili
<iframe>
sürümü. Google düzgün çalışması için birchild-src https://facebook.com
yönergesi gerektirir. Not Facebook'un sağladığı<iframe>
kodu, varsayılan olarak URL,//facebook.com
. HTTPS'yi açık bir şekilde belirtmek için bunu değiştirin:https://facebook.com
Zorunlu değilse HTTP kullanmanız gerekmez.Twitter'ın Tweet düğmesi ikisinde de barındırılan bir komut dosyası ve çerçeve erişimi temel alınır.
https://platform.twitter.com
. (Twitter da aynı şekilde default; kodu yerel olarak kopyalarken/yapıştırırken HTTPS'yi belirtecek şekilde düzenleyin.) JavaScript snippet'ini taşıdığınız sürecescript-src https://platform.twitter.com; child-src https://platform.twitter.com
ayarı tamamlanmış olur harici bir JavaScript dosyasına sağlayabilir.Diğer platformlar da benzer şartlara sahiptir ve benzer şekilde ele alınabilir.
default-src
için'none'
ayarlamanızı ve konsolunuzu aşağıdaki durumlarda izlemenizi öneririz: widget'ların çalışması için etkinleştirmeniz gereken kaynakları belirleyin.
Birden fazla widget eklemek kolaydır: Politikayı bir arada kullanmak aynı türdeki tüm kaynakları tek bir kaynakta birleştirmeyi yönergesini inceleyin. Üç sosyal medya widget'ını da kullanmak isteseydiniz politika, aşağıdaki gibidir:
script-src https://apis.google.com https://platform.twitter.com; child-src https://plusone.google.com https://facebook.com https://platform.twitter.com
2. kullanım alanı: Tam kilitleme
Bir bankacılık sitesi işlettiğinizi ve Google Haberler'in
yalnızca sizin yazdığınız kaynaklar yüklenebilir. Bu senaryoda
kesinlikle her şeyi (default-src 'none'
) engelleyen varsayılan bir politikayla başlayıp buradan büyür.
Bankanın tüm resimleri, stilleri ve komut dosyasını bir CDN'den yüklediğini varsayalım.
https://cdn.mybank.net
ve XHR üzerinden https://api.mybank.com/
hattına bağlanır ve
küçük veri parçalarını aşağı çekin. Çerçeveler, ancak yalnızca
(üçüncü taraf kaynaklı kaynak yok). Sitede Flash yoktur, yazı tipi veya
yazı tipi yoktur.
özellikler. Gönderebileceğimiz en kısıtlayıcı CSP başlığı şudur:
Content-Security-Policy: default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; child-src 'self'
3. Kullanım alanı: Yalnızca SSL
Alyans tartışma forumu yöneticisi, tüm kaynakların ancak güvenli kanallar aracılığıyla yüklenir ancak çok fazla kod yazmaz; yeniden yazma üçüncü taraf forum yazılımının parçacıkları satır içi senaryo ve stil becerileri dışındadır. Aşağıdaki politika, geçerlilik tarihi:
Content-Security-Policy: default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'
default-src
içinde https:
belirtilmiş olsa da, komut dosyası ve stil
yönergeler bu kaynağı otomatik olarak devralmaz. Her yönergeyi tamamen
kaynak türü için varsayılan değerin üzerine yazılır.
Gelecek
İçerik Güvenliği Politikası Düzey 2, Aday Önerisi. W3C'nin Web Uygulaması Güvenliği Çalışma Grubu spesifikasyonun bir sonraki yinelemesi üzerinde çalışmaya başladı bile İçerik Güvenliği Politikası 3. Düzey.
Yakında kullanıma sunulacak bu özelliklerle ilgili tartışmak isterseniz public-webappsec@ posta listesi arşivlerine göz atın, kendiniz de katılın.