Yeni
Content-Security-Policy
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 |
---|---|---|---|---|---|
Content-Security-Policy CSP Level 2 |
40+ Ocak 2015 | 31+ Kısmen Temmuz 2014 |
– | – | – |
Content-Security-Policy 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ı | |
X-Webkit-CSP 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 |
---|---|---|
default-src |
'self' cdn.ornek.com |
default-src 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+ |
script-src |
'self' js.ornek.com |
Geçerli JavaScript kaynakları tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
style-src |
'self' css.ornek.com |
Geçerli CSS kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
img-src |
'self' img.ornek.com |
Geçerli resim kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
connect-src |
'self' |
XMLHttpRequest (AJAX), WebSocket veya EventSource için tanımlanır. Eğer izin verilmeyen kaynaktan bu sorgular yapılırsa tarayıcıdan 400 HTTP kodu döner. CSP Level 1 25+ 23+ 7+ 12+ |
font-src |
font.ornek.com |
Geçerli yazı tipi kaynaklarını tanımlar.
CSP Level 1 25+ 23+ 7+ 12+ |
object-src |
'self' |
<object> , <embed> veya <applet> için geçerli kaynakları tanımlar. CSP Level 1 25+ 23+ 7+ 12+ |
media-src |
media.ornek.com |
HTML5’in
<audio> , <video> etiketleri gibi geçerli ses ve görüntü kaynaklarını tanımlar. CSP Level 1 25+ 23+ 7+ 12+ |
frame-src |
'self' |
Geçerli çerçeve kaynağını tanımlar. Artık
child-src kullanılıyor, bu yöntem kullanımdan kaldırıldı. Kullanımdan kaldırıldı. |
sandbox |
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-forms allow-same-origin allow-scripts allow-popups , allow-modals , allow-orientation-lock , allow-pointer-lock , allow-presentation , allow-popups-to-escape-sandbox ve allow-top-navigation CSP Level 1 25+ 50+ 7+ 12+ |
report-uri |
/report-uri |
Tarayıcıya belirttiğiniz adrese direktiflerinizle ilgili hataların POST edilmesini sağlar.
-Report-Only ekleyerek herhangi bir şeyi bloklamadan sadece belirttiğiniz adrese rapor gönderir.. CSP Level 1 25+ 23+ 7+ 12+ |
child-src |
'self' |
<frame> ve <iframe> için geçerli kaynakları tanımlar. CSP Level 2 40+ 45+ |
form-action |
'self' |
HTML
<form> işlemi için geçerli kaynakları tanımlar. CSP Level 2 40+ 36+ |
frame-ancestors |
'none' |
<frame> <iframe> <object> <embed> <applet> dökümanınıza ekleyebileceğiniz bu etiketlerin kaynaklarını tanımlar. Bu direktifi 'none' olarak ayarlamak şuna da eşit sayılır X-Frame-Options: DENY CSP Level 2 39+ 33+ |
plugin-types |
'application/pdf' |
<object> ve <embed> ile dökümanınıza ekleyebileceğiniz MIME tiplerini limitler. Örneğin <applet> 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 |
---|---|---|
* |
img-src * |
Yıldız işareti data: blob: filesystem: şeması dışındaki bütün URL’leri kabul eder. |
'none' |
object-src 'none' |
Hiç bir kaynaktan içerik kabul etme. |
'self' |
script-src 'self' |
Aynı alan adın, ip vs.’den içerik yüklemesine izin verir. |
data: |
img-src 'self' data: |
data: şemasından resim yüklenmesine izin verir(base64 şifrelenmiş resimler) |
domain.ornek.com |
img-src domain.ornek.com |
İçerikler sadece belirtilen domain’den indirilir |
*.ornek.com |
img-src *.ornek.com |
Bütün alt alan isimlerine izin verir
example.com |
https://cdn.com |
img-src https://cdn.com |
Belirtilen domain’e HTTPS protokolü kullanmak şartıyla izin verir. |
https: |
img-src https: |
HTTPS olsun hangi domain olursa olsun :) |
'unsafe-inline' |
script-src 'unsafe-inline' |
Style, onlick vs. gibi inline kodlama dediğimiz olaya izin verir. |
'unsafe-eval' |
script-src 'unsafe-eval' |
Dinamik JavaScript kod çalıştırıcısına izin verir
eval() |
Content-Security-Policy Örnekleri
Aşağıda bir kaç örnek Content-Security-Policy örnekleri mevcuttur.
Aynı Domain’den Olan Herşeyi Kabul Et
default-src 'self';
JavaScript’i Aynı Domain’se Kabul Et
script-src 'self';
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>