İçerik Güvenliği Politikası

Joe Medley
Joe Medley

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.

Konsol hatası: "http://evil.example.com/evil.js" komut dosyasının yüklenmesi reddedildi çünkü şu İçerik Güvenliği Politikası yönergesini ihlal ediyor: script-src 'self' https://apis.google.com

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ı tipleri font-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 gibi child-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 veya setInterval ç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 politika script-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 bir child-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ürece script-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.

Geri bildirim