Content-Security-Policy
Meta etiketi, riskini azaltmak için izin verir XSS kaynakları başka yerlerden yükleme verilerinden tarayıcılar engelleyen, yüklenebilir nerede tanımlamak için izin vererek saldırıları. Bu, bir saldırganın sitenize kötü amaçlı kod eklemesini zorlaştırır.
Kafamı neden birbiri ardına CSP hataları aldığımı anlamaya çalışan bir tuğla duvara çarptım ve nasıl çalıştığına dair kesin ve net talimatlar yoktu. Bu yüzden , CSP'nin bazı noktalarını kısaca açıklamaya çalışıyorum , çoğunlukla çözmek zor bulduğum şeylere odaklanıyoruz.
Kısacası, her örnekte tam etiketi yazmayacağım. Bunun yerine sadececontent
özelliği , bu yüzden bir örnek şu content="default-src 'self'"
anlama gelir:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
1. Birden fazla kaynağa nasıl izin verilir?
Bir yönergeden sonra kaynaklarınızı boşlukla ayrılmış bir liste olarak listeleyebilirsiniz:
content="default-src 'self' https://example.com/js/"
Özel parametreler dışında tırnak işaretleri bulunmadığını unutmayın gibi olanlar 'self'
. Ayrıca, :
direktiften sonra iki nokta üst üste ( ) işareti yoktur . Sadece yönerge, sonra boşlukla ayrılmış bir parametre listesi.
Belirtilen parametrelerin altındaki her şeye dolaylı olarak izin verilir. Bu, yukarıdaki örnekte bunların geçerli kaynaklar olacağı anlamına gelir:
https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js
Ancak bunlar geçerli olmaz:
http://example.com/js/file.js
^^^^ wrong protocol
https://example.com/file.js
^^ above the specified path
2. Farklı direktifler nasıl kullanılır, her biri ne yapar?
En yaygın direktifler:
default-src
javascript, resimler, CSS, yazı tipleri, AJAX istekleri vb. yüklemek için varsayılan politika
script-src
javascript dosyaları için geçerli kaynakları tanımlar
style-src
css dosyaları için geçerli kaynakları tanımlar
img-src
görüntüler için geçerli kaynakları tanımlar
connect-src
XMLHttpRequest (AJAX), WebSockets veya EventSource için geçerli hedefleri tanımlar. Burada izin verilmeyen bir ana bilgisayara bağlantı denemesi yapılırsa tarayıcı bir 400
hata taklit eder
Başkaları da var, ama bunlar en çok ihtiyacınız olanlar.
3. Birden çok direktif nasıl kullanılır?
Noktalı virgül ( ;
) ile sonlandırarak tek bir meta etiket içindeki tüm yönergelerinizi tanımlarsınız :
content="default-src 'self' https://example.com/js/; style-src 'self'"
4. liman nasıl ele alınır?
Varsayılan bağlantı noktaları dışındaki her şeye izin verilen alan adından sonra bağlantı noktası numarası veya yıldız işareti eklenerek açıkça izin verilmelidir:
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"
Yukarıdaki sonuç:
https://ajax.googleapis.com:123
^^^^ Not ok, wrong port
https://ajax.googleapis.com - OK
http://example.com/free/stuff/file.js
^^ Not ok, only the port 123 is allowed
http://example.com:123/free/stuff/file.js - OK
Bahsettiğim gibi, tüm bağlantı noktalarına açıkça izin vermek için bir yıldız işareti de kullanabilirsiniz:
content="default-src example.com:*"
5. Nasıl farklı protokolleri işlemek için?
Varsayılan olarak, yalnızca standart protokollere izin verilir. Örneğin, WebSockets'e ws://
izin vermek için açıkça izin vermeniz gerekir:
content="default-src 'self'; connect-src ws:; style-src 'self'"
^^^ web sockets are now allowed on all domains and ports
6. Dosya protokolüne nasıl izin verilir file://
?
Eğer böyle tanımlamaya çalışırsanız işe yaramaz. Bunun yerine, şu filesystem
parametre ile izin verirsiniz :
content="default-src filesystem"
7. Satır içi komut dosyaları ve stil tanımlamaları nasıl kullanılır?
Açıkça izin verilmedikçe, satır içi stil tanımlarını, <script>
etiketlerin içindeki kodu veya gibi etiket özelliklerinde kullanamazsınız onclick
. Onlara şöyle izin veriyorsunuz:
content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"
Ayrıca satır içi, base64 kodlu resimlere açıkça izin vermeniz gerekir:
content="img-src data:"
8. Nasıl izin verilir eval()
?
Eminim birçok insan bunu söylemez. Bu insanlar yanlış olur. Elbette, eval ile sitenizin güvenliğine kesinlikle büyük delikler açabilirsiniz, ancak mükemmel geçerli kullanım durumlarına sahiptir. Sadece kullanmak konusunda akıllı olmalısınız. Buna izin veriyorsunuz:
content="script-src 'unsafe-eval'"
9. Tam olarak ne anlama 'self'
geliyor?
Alabilirsin 'self'
aynı ana bilgisayarda ortalama localhost, yerel dosya sisteminde veya bir şey. Bunların hiçbiri anlamına gelmez. İçerik politikasının tanımlandığı dosyayla aynı şemaya (protokol), aynı ana bilgisayara ve aynı bağlantı noktasına sahip olan kaynaklar anlamına gelir. Sitenizi HTTP üzerinden mi sunuyorsunuz? Açıkça tanımlamazsanız, sizin için https yok.
Kullandım 'self'
genellikle dahil etmek mantıklı gibi çoğu örneklerde, ancak zorunlu hiçbir şekilde bu. İhtiyacınız yoksa dışarıda bırakın.
Ama bir dakika bekle! Sadece onunla kullanıp bitiremez miyim content="default-src *"
?
Hayır. Belirgin güvenlik açıklarına ek olarak, bu beklediğiniz gibi çalışmaz. Bazı dokümanlar her şeye izin verdiğini iddia etse de , bu doğru değil. Satır içi veya geliştirmelere izin vermez, bu nedenle sitenizi gerçekten daha savunmasız hale getirmek için şunu kullanırsınız:
content="default-src * 'unsafe-inline' 'unsafe-eval'"
... ama güvenmeyeceğine inanıyorum.
Daha fazla okuma:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy