Yeni
HTTP yanıt başlığı(response header) modern tarayıcılarda yaşabileceğiniz XSS saldırılarını azaltmayı amaçlamaktadır.
Direktiflerden önce hangi tarayıcıların bu başlığı destekleyip desteklemediğini inceleylim.
Tarayıcı Destekleri
Header |
Chrome |
FireFox |
Safari |
IE |
Edge |
CSP Level 2 |
40+ Ocak 2015 |
31+ Kısmen
Temmuz 2014 |
– |
– |
– |
CSP 1.0 |
25+ |
23+ |
7+ |
– |
Edge 12 build 10240+ |
|
X-Content-Security-Policy |
Kullanımdan kaldırıldı |
|
4+ |
– |
10+ Kısıtlı |
12+ Kısıtlı |
Kullanımdan Kaldırıldı |
14+ |
– |
6+ |
– |
– |
Kaynaklar caniuse.com/contentsecuritypolicy, caniuse.com/contentsecuritypolicy2 ve hacks.mozilla.org/2013/05/content-security-policy-1-0-lands-in-firefox-aurora/
Tarayıcınızın CSP başlığını destekleyip desteklemediğiniz şu adresten kontrol edebilirsiniz: content-security-policy.com/browser-test/
Dikkat: Content-Security-Policy başlığı ile X-Content-Security-Policy veya X-Webkit-CSP başlığının beraber kullanılması tarayıcı bazı anormal durumlara yol açabiliyor. Kullanmayın.
Direktifler
Content-Security-Policy başlığı aşağıda tanımlanan direktiflerden biri veya bir kaçı ile birden oluşturulabilir. Birden fazla direktif noktalı virgül ; kullanarak ayrılmalıdır.
Bu tablo hazırlanırken şu adresteki belgeden faydalanılmıştır:
Direktif |
Örnek Değer |
Açıklama |
|
|
direktifi JavaScript, Resimler, CSS, Font, AJAX sorguları, html5 medyaları vs. için varsayılan politikadır.Örnek değerleri sayfanın aşağısında göreceksiniz.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
Geçerli JavaScript kaynakları tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
Geçerli CSS kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
Geçerli resim kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
(AJAX),
veya
için tanımlanır. Eğer izin verilmeyen kaynaktan bu sorgular yapılırsa tarayıcıdan
HTTP kodu döner.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
Geçerli yazı tipi kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
,
veya
için geçerli kaynakları tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
HTML5’in
,
etiketleri gibi geçerli ses ve görüntü kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
Geçerli çerçeve kaynağını tanımlar. Artık
kullanılıyor, bu yöntem kullanımdan kaldırıldı.
Kullanımdan kaldırıldı. |
|
|
allow-forms allow-scripts |
|
Sandbox modu sayesinde bir çok etkinliği kısıtlayabilirsiniz. Popupları engeller, formları durdurur, javascriptleri çalıştırmaz vs. vs.
Sandbox direktifi için boş değer girerseniz aşağıdaki listenin tümünü girmiş sayılırsınız veyahut sadece seçtiklerinizin de çalışmasın sağlayabilirsiniz:
,
,
,
,
,
|
allow-popups-to-escape-sandbox |
ve
CSP Level 1 25+ 50+ 7+ 12+ |
|
|
Tarayıcıya belirttiğiniz adrese direktiflerinizle ilgili hataların POST edilmesini sağlar.
ekleyerek herhangi bir şeyi bloklamadan sadece belirttiğiniz adrese rapor gönderir..
CSP Level 1 25+ 23+ 7+ 12+ |
|
|
ve
için geçerli kaynakları tanımlar.
CSP Level 2 40+ 45+ |
|
|
HTML
işlemi için geçerli kaynakları tanımlar.
CSP Level 2 40+ 36+ |
|
|
dökümanınıza ekleyebileceğiniz bu etiketlerin kaynaklarını tanımlar. Bu direktifi
olarak ayarlamak şuna da eşit sayılır
CSP Level 2 39+ 33+ |
|
|
ve
ile dökümanınıza ekleyebileceğiniz MIME tiplerini limitler. Örneğin
eklemek istiyorsanız şunu kullanmalısınız
|
application/x-java-applet |
.
CSP Level 2 40+ |
Kaynak Listesi Örnekleri
Yukarıda paylaşmış olduğum direktiflerden sonu -src ile biten direktifler Kaynak Listesi denilen benzer değerler alırlar. ‘none’ dışında bütün kaynaklar birbirleriyle beraber kullanılabilir.
Kaynak Değeri |
Örnek |
Açıklama |
|
|
Yıldız işareti data: blob: filesystem: şeması dışındaki bütün URL’leri kabul eder. |
|
|
Hiç bir kaynaktan içerik kabul etme. |
|
|
Aynı alan adın, ip vs.’den içerik yüklemesine izin verir. |
|
|
data: şemasından resim yüklenmesine izin verir(base64 şifrelenmiş resimler) |
|
|
İçerikler sadece belirtilen domain’den indirilir |
|
|
Bütün alt alan isimlerine izin verir
|
|
|
Belirtilen domain’e HTTPS protokolü kullanmak şartıyla izin verir. |
|
|
HTTPS olsun hangi domain olursa olsun :) |
|
|
script-src 'unsafe-inline' |
|
Style, onlick vs. gibi inline kodlama dediğimiz olaya izin verir. |
|
|
Dinamik JavaScript kod çalıştırıcısına izin verir
|
Content-Security-Policy Örnekleri
Aşağıda bir kaç örnek Content-Security-Policy örnekleri mevcuttur.
Aynı Domain’den Olan Herşeyi Kabul Et
JavaScript’i Aynı Domain’se Kabul Et
Google Analytics’i, Google AJAX CDN’sini ve Aynı Domain’den JavaScript’i Kabul Et
|
script-src 'self' www.google-analytics.com ajax.googleapis.com; |
Acemi Politikası
Yeni başlayanların kullanabileceği bir politika, kural olabilir bu. Aynı domain’den resimlere, scriptlere, css ve AJAX’a izin verir. Ve object, media ve frame gibi diğer nesneleri kullanılamaz hale getirir.
|
default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; |
Content-Security-Policy Hata Mesajları
Chrome’da geliştirici araçlarında Content-Security-Policy kurallarını ihlal ettiğinizde şu hatayı görürsünüz:
Refused to load the script ‘script-uri’ because it violates the following Content Security Policy directive: “your CSP directive”.
Firefox’da ise web geliştirici araçlarında aynı durumda bu hatayı görürsünüz:
Content Security Policy: A violation occurred for a report-only CSP policy (“An attempt to execute inline scripts has been blocked”). The behavior was allowed, and a CSP report was sent.
Sunucu Taraflı Ayarlama
Sunucu taraflı kodlamalarda kullandığınız web sunucusu HTTP başlıkları göndermenize olanak sağlar. Aşağıda Apache ve Nginx için bu işin yolu yordamı gösterilmiştir.
Apache’de Content-Security-Policy Başlığı Ayarlama
Aşağıdaki kodu Apache konfigürasyon dosyanızda VirtualHost’unuzun olduğu bölüme (httpd.conf) veya .htaccess dosyanıza ekleyebilirsiniz:
|
Header set Content-Security-Policy "default-src 'self';" |
Nginx’de Content-Security-Policy Başlığı Ayarlama
Aşağıdaki kodu server{} bloğunuzun arasına ekleyin:
|
add_header Content-Security-Policy "default-src 'self';"; |
IIS’de Content-Security-Policy Başlığı
|
<system.webServer> <httpProtocol> <customHeaders> <add name="Content-Security-Policy" value="default-src 'self';" /> </customHeaders> </httpProtocol> </system.webServer> |
Kaynaklar
Yorumlar