Skip to content

Content Security Policy Hakkında Detaylı Bilgi

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
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>

Kaynaklar

TR Kodlama GitHub'da!

TR Kodlama'da yer alan makaleleri GitHub üzerinden düzenleyebileceğinizi biliyor muyudunuz? Harika değil mi? Bu makale ile ilgili düzenleme yapmak isterseniz aşağıdaki butona tıklayınız!

GitHub'da Görüntüle ve Düzenle!