İçerik Güvenliği Politikası (CSP) ve JavaScript tabanlı saldırıları önlemedeki kritik rolünü derinlemesine inceleyin. Web uygulamalarınızı XSS ve diğer zafiyetlerden korumak için pratik uygulama stratejileri ve en iyi küresel güvenlik uygulamalarını öğrenin.
Web Güvenlik Başlıkları: İçerik Güvenliği Politikası ve JavaScript Yürütme
Günümüzün karmaşık dijital dünyasında, web uygulaması güvenliği her şeyden önemlidir. Çeşitli saldırılara, özellikle de Siteler Arası Betik Çalıştırma'ya (XSS) karşı en etkili savunmalardan biri Web Güvenlik Başlıklarının kullanılmasıdır. Bunlar arasında, İçerik Güvenliği Politikası (CSP), bir tarayıcının belirli bir sayfa için yüklemesine izin verilen kaynakları kontrol etmek için güçlü bir mekanizma olarak öne çıkmaktadır. Bu makale, web uygulamalarınızı ve kullanıcılarınızı korumak için CSP'yi etkili bir şekilde anlamak ve uygulamak için kapsamlı bir rehber sunmaktadır.
Web Güvenlik Başlıklarını Anlamak
Web Güvenlik Başlıkları, tarayıcıya belirli içerik türlerini işlerken nasıl davranması gerektiği konusunda talimatlar veren HTTP yanıt başlıklarıdır. Derinlemesine savunma stratejisinin önemli bir parçasıdırlar ve riskleri azaltmak için diğer güvenlik önlemleriyle birlikte çalışırlar.
En sık kullanılan web güvenlik başlıklarından bazıları şunlardır:
- İçerik Güvenliği Politikası (CSP): Kullanıcı aracısının yüklemesine izin verilen kaynakları kontrol eder.
- HTTP Sıkı Taşıma Güvenliği (HSTS): Tarayıcıları HTTPS kullanmaya zorlar.
- X-Frame-Options: Tıklama Tuzağı (Clickjacking) saldırılarına karşı korur.
- X-Content-Type-Options: MIME-sniffing zafiyetlerini önler.
- Referrer-Policy: İsteklere ne kadar yönlendiren bilgisi dahil edilmesi gerektiğini kontrol eder.
- Permissions-Policy (önceki adıyla Feature-Policy): Tarayıcı özellikleri üzerinde ayrıntılı kontrol sağlar.
Bu makale öncelikli olarak İçerik Güvenliği Politikası'na (CSP) ve bunun JavaScript yürütmesi üzerindeki etkisine odaklanmaktadır.
İçerik Güvenliği Politikası (CSP) Nedir?
CSP, tarayıcının kaynakları yüklemesine izin verilen kaynakların bir beyaz listesini tanımlamanıza olanak tanıyan bir HTTP yanıt başlığıdır. Buna JavaScript, CSS, resimler, yazı tipleri ve diğer varlıklar dahildir. Bu güvenilir kaynakları açıkça tanımlayarak, kötü amaçlı betiklerin web sitenize enjekte edildiği ve kullanıcılarınızın tarayıcıları bağlamında yürütüldüğü XSS saldırıları riskini önemli ölçüde azaltabilirsiniz.
CSP'yi tarayıcınız için bir güvenlik duvarı olarak düşünün, ancak ağ trafiğini engellemek yerine güvenilmeyen kodun yürütülmesini engeller.
CSP, JavaScript Yürütmesi İçin Neden Önemlidir?
JavaScript, dinamik ve etkileşimli web deneyimleri oluşturmak için kullanılabilecek güçlü bir dildir. Ancak esnekliği, onu saldırganlar için de birincil hedef haline getirir. XSS saldırıları genellikle, daha sonra kullanıcı kimlik bilgilerini çalmak, kullanıcıları kimlik avı sitelerine yönlendirmek veya web sitesinin görünümünü bozmak için kullanılabilecek kötü amaçlı JavaScript kodunun bir web sitesine enjekte edilmesini içerir.
CSP, JavaScript'in yüklenebileceği ve yürütülebileceği kaynakları kısıtlayarak bu saldırıları etkili bir şekilde önleyebilir. Varsayılan olarak CSP, tüm satır içi JavaScript'i (<script> etiketleri içindeki kod) ve harici alan adlarından yüklenen JavaScript'i engeller. Ardından CSP yönergelerini kullanarak güvenilir kaynakları seçici olarak etkinleştirirsiniz.
CSP Yönergeleri: Politikanızın Yapı Taşları
CSP yönergeleri, yüklenmesine izin verilen kaynak türlerini ve bunların yüklenebileceği kaynakları tanımlar. İşte en önemli yönergelerden bazıları:
default-src: Diğer getirme yönergeleri için bir geri dönüş görevi görür. Belirli bir yönerge tanımlanmamışsa,default-srckullanılır.script-src: JavaScript kodu için izin verilen kaynakları belirtir.style-src: CSS stil sayfaları için izin verilen kaynakları belirtir.img-src: Resimler için izin verilen kaynakları belirtir.font-src: Yazı tipleri için izin verilen kaynakları belirtir.media-src: Ses ve video dosyaları için izin verilen kaynakları belirtir.object-src: Eklentiler (ör. Flash) için izin verilen kaynakları belirtir.frame-src: Çerçeveler (<frame>,<iframe>) için izin verilen kaynakları belirtir.connect-src: Ağ istekleri (ör. XMLHttpRequest, Fetch API, WebSockets) için izin verilen kaynakları belirtir.base-uri: Bir belgenin<base>öğesinde kullanılabilecek URL'leri kısıtlar.form-action: Formların gönderilebileceği URL'leri kısıtlar.upgrade-insecure-requests: Tarayıcıya tüm güvensiz URL'leri (HTTP) güvenli URL'lere (HTTPS) yükseltmesi talimatını verir.block-all-mixed-content: Sayfa HTTPS üzerinden yüklendiğinde tarayıcının HTTP kullanarak herhangi bir kaynak yüklemesini engeller.
Her yönerge, aşağıdakiler de dahil olmak üzere çeşitli kaynak ifadelerini kabul edebilir:
*: Herhangi bir kaynaktan kaynaklara izin verir (genellikle önerilmez).'self': Belgeyle aynı kaynaktan (şema, ana bilgisayar ve bağlantı noktası) kaynaklara izin verir.'none': Tüm kaynaklardan gelen kaynaklara izin vermez.'unsafe-inline': Satır içi JavaScript ve CSS kullanımına izin verir (kesinlikle önerilmez).'unsafe-eval':eval()ve ilgili işlevlerin kullanımına izin verir (kesinlikle önerilmez).'unsafe-hashes': SHA256, SHA384 veya SHA512 özetlerine göre belirli satır içi olay işleyicilerine izin verir (dikkatli kullanın).data:: data: URI'lerine izin verir (ör. base64 olarak kodlanmış satır içi resimler).- https://example.com: Belirtilen alan adından (ve isteğe bağlı olarak bağlantı noktasından) HTTPS üzerinden kaynaklara izin verir.
- *.example.com: example.com'un herhangi bir alt alan adından kaynaklara izin verir.
- nonce-{random-value}: Eşleşen bir nonce özniteliğine sahip belirli satır içi betiklere veya stillere izin verir (satır içi kod için önerilir).
- sha256-{hash-value}: Eşleşen bir SHA256 özetine sahip belirli satır içi betiklere veya stillere izin verir (nonce'lara alternatif).
CSP Uygulaması: Pratik Örnekler
CSP'yi uygulamanın iki temel yolu vardır:
- HTTP Başlığı: HTTP yanıtında
Content-Security-Policybaşlığını göndermek. Bu, tercih edilen yöntemdir. <meta>Etiketi: HTML belgesinin<head>bölümünde bir<meta>etiketi kullanmak. Bu yöntemin sınırlamaları vardır ve genellikle önerilmez.
HTTP Başlığını Kullanma
CSP başlığını ayarlamak için web sunucunuzu yapılandırmanız gerekir. Tam adımlar sunucunuza (ör. Apache, Nginx, IIS) bağlı olarak değişecektir.
İşte bazı CSP başlık örnekleri:
Temel CSP
Bu politika yalnızca aynı kaynaktan gelen kaynaklara izin verir:
Content-Security-Policy: default-src 'self';
Belirli Alan Adlarından Kaynaklara İzin Verme
Bu politika, https://cdn.example.com adresinden JavaScript'e ve https://images.example.net adresinden resimlere izin verir:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; img-src 'self' https://images.example.net;
Satır İçi Betikler İçin Nonce Kullanımı
Bu politika, eşleşen bir nonce özniteliğine sahip satır içi betiklere izin verir:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-rAnd0mN0nc3';
HTML'inizde:
<script nonce="rAnd0mN0nc3">
// Your inline script
</script>
Not: Saldırganların CSP'yi atlamasını önlemek için nonce değeri her istek için rastgele oluşturulmalıdır.
Satır İçi Betikler İçin Özet (Hash) Kullanımı
Bu politika, SHA256 özetlerine göre belirli satır içi betiklere izin verir:
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=';
SHA256 özetini oluşturmak için çeşitli çevrimiçi araçları veya komut satırı yardımcı programlarını (ör. openssl dgst -sha256 -binary input.js | openssl base64) kullanabilirsiniz.
<meta> Etiketini Kullanma
Karmaşık politikalar için önerilmese de, <meta> etiketi temel bir CSP ayarlamak için kullanılabilir. Örneğin:
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<meta> Etiketinin Sınırlamaları:
report-uriyönergesini belirtmek için kullanılamaz.- HTTP başlığı kadar yaygın olarak desteklenmez.
- Karmaşık politikalar için daha az esnek ve yönetimi daha zordur.
CSP Yalnızca Raporlama Modu
Bir CSP'yi uygulamadan önce, Content-Security-Policy-Report-Only başlığını kullanmanız şiddetle tavsiye edilir. Bu, herhangi bir kaynağı fiilen engellemeden politikanızın etkisini izlemenize olanak tanır. Tarayıcı, herhangi bir ihlali belirtilen bir URL'ye raporlayarak, politikanızı üretimde dağıtmadan önce ince ayar yapmanıza olanak tanır.
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report;
CSP raporlarını almak ve işlemek için sunucu tarafı bir uç nokta (ör. /csp-report) yapılandırmanız gerekecektir. Bu raporlar genellikle ihlal edilen yönerge, engellenen URI ve diğer ilgili ayrıntılar hakkında bilgi içeren JSON nesneleridir.
Yaygın CSP Hataları ve Bunlardan Kaçınma Yolları
CSP uygulamak zor olabilir ve güvenliğinizi zayıflatan veya web sitenizi bozan hatalar yapmak kolaydır. İşte kaçınılması gereken bazı yaygın tuzaklar:
'unsafe-inline've'unsafe-eval'kullanmak: Bu yönergeler esasen CSP tarafından sunulan korumaları devre dışı bırakır ve mümkün olduğunca kaçınılmalıdır. Satır içi betikler için nonce'lar veya özetler kullanın veeval()kullanmaktan kaçının.*kullanmak: Herhangi bir kaynaktan kaynaklara izin vermek, CSP'nin amacını boşa çıkarır. Politikanızı tanımlarken olabildiğince spesifik olun.- Kapsamlı test yapmamak: CSP'nizi zorunlu kılmadan önce daima yalnızca raporlama modunda test edin. Raporları izleyin ve politikanızı gerektiği gibi ayarlayın.
report-uri'yi yanlış yapılandırmak: Rapor URI uç noktanızın CSP raporlarını almak ve işlemek için doğru yapılandırıldığından emin olun.- CSP'nizi güncellememek: Web siteniz geliştikçe, CSP'nizin kaynak bağımlılıklarınızdaki değişiklikleri yansıtacak şekilde güncellenmesi gerekebilir.
- Aşırı kısıtlayıcı politikalar: Çok kısıtlayıcı politikalar web sitenizi bozabilir ve kullanıcıları hayal kırıklığına uğratabilir. Güvenlik ve kullanılabilirlik arasında bir denge bulun.
CSP ve Üçüncü Taraf Kütüphaneler
Birçok web sitesi, CDN'ler, analitik sağlayıcıları ve sosyal medya widget'ları gibi üçüncü taraf kütüphanelere ve hizmetlere güvenir. CSP'yi uygularken, bu bağımlılıkları göz önünde bulundurmak ve politikanızın kaynakları doğru şekilde yüklemelerine izin verdiğinden emin olmak önemlidir.
Üçüncü taraf kütüphanelerle başa çıkmak için bazı stratejiler şunlardır:
- Güvenilir üçüncü taraf sağlayıcıların alan adlarını açıkça beyaz listeye alın: Örneğin, bir CDN'den jQuery kullanıyorsanız, CDN'nin alan adını
script-srcyönergenize ekleyin. - Alt Kaynak Bütünlüğü (SRI) kullanın: SRI, üçüncü taraf kaynaklardan yüklediğiniz dosyaların tahrif edilmediğini doğrulamanıza olanak tanır. SRI kullanmak için, dosyanın bir kriptografik özetini oluşturmanız ve bunu
<script>veya<link>etiketine dahil etmeniz gerekir. - Üçüncü taraf kütüphaneleri kendi sunucunuzda barındırmayı düşünün: Bu size kaynaklar üzerinde daha fazla kontrol sağlar ve harici sağlayıcılara olan bağımlılığınızı azaltır.
SRI kullanan örnek:
<script
src="https://cdn.example.com/jquery.min.js"
integrity="sha384-vtXRMe3mGCkKsTB9UMvnoknreNzcMRujMQFFSQhtI2zxLlClmHsfq9em6JzhbqQ"
crossorigin="anonymous"></script>
CSP ve Tek Sayfa Uygulamaları (SPA'lar)
SPA'lar genellikle JavaScript ve dinamik kod üretimine büyük ölçüde güvenir, bu da CSP uygulamasını daha zor hale getirebilir. SPA'ları CSP ile güvence altına almak için bazı ipuçları şunlardır:
'unsafe-eval'kullanmaktan kaçının: SPA'lar genellikleeval()'e dayanan şablon motorları veya diğer teknikleri kullanır. Bunun yerine, önceden derlenmiş şablonlar gibieval()gerektirmeyen alternatif yaklaşımları kullanmayı düşünün.- Satır içi betikler için nonce'lar veya özetler kullanın: SPA'lar genellikle JavaScript kodunu dinamik olarak enjekte eder. Yalnızca güvenilir kodun yürütüldüğünden emin olmak için nonce'ları veya özetleri kullanın.
connect-srcyönergesini dikkatlice yapılandırın: SPA'lar genellikle çeşitli uç noktalara API istekleri yapar.connect-srcyönergesinde yalnızca gerekli alan adlarını beyaz listeye aldığınızdan emin olun.- CSP uyumlu bir framework kullanmayı düşünün: Bazı JavaScript frameworkleri, CSP için yerleşik destek sağlayarak güvenli bir politika uygulamayı ve sürdürmeyi kolaylaştırır.
CSP ve Uluslararasılaştırma (i18n)
Küresel bir kitle için web uygulamaları geliştirirken, CSP'nin uluslararasılaştırma (i18n) üzerindeki etkisini göz önünde bulundurmak önemlidir. İşte akılda tutulması gereken bazı faktörler:
- İçerik Dağıtım Ağları (CDN'ler): Web sitenizin varlıklarını dağıtmak için bir CDN kullanıyorsanız, CSP'nizde CDN'nin alan adlarını beyaz listeye aldığınızdan emin olun. Performansı optimize etmek için farklı bölgeler için farklı CDN'ler kullanmayı düşünün.
- Harici Yazı Tipleri: Harici yazı tipleri (ör. Google Fonts) kullanıyorsanız, yazı tipi sağlayıcılarının alan adlarını
font-srcyönergenizde beyaz listeye aldığınızdan emin olun. - Yerelleştirilmiş İçerik: Farklı diller veya bölgeler için web sitenizin farklı sürümlerini sunuyorsanız, CSP'nizin her sürüm için doğru şekilde yapılandırıldığından emin olun.
- Üçüncü Taraf Entegrasyonları: Belirli bölgelere özgü üçüncü taraf hizmetlerle entegre oluyorsanız, bu hizmetlerin alan adlarını CSP'nizde beyaz listeye aldığınızdan emin olun.
CSP En İyi Uygulamaları: Küresel Bir Bakış Açısı
İşte küresel bir perspektifi dikkate alarak CSP'yi uygulamak için bazı genel en iyi uygulamalar:
- Kısıtlayıcı bir politikayla başlayın: Varsayılan olarak her şeyi engelleyen bir politikayla başlayın ve ardından güvenilir kaynakları seçici olarak etkinleştirin.
- Önce yalnızca raporlama modunu kullanın: Potansiyel sorunları belirlemek için zorunlu kılmadan önce CSP'nizi yalnızca raporlama modunda test edin.
- CSP raporlarını izleyin: Potansiyel güvenlik açıklarını belirlemek ve politikanızı iyileştirmek için CSP raporlarını düzenli olarak gözden geçirin.
- Satır içi betikler için nonce'lar veya özetler kullanın:
'unsafe-inline've'unsafe-eval'kullanmaktan kaçının. - Kaynak listelerinizde spesifik olun: Kesinlikle gerekli olmadıkça joker karakterler (
*) kullanmaktan kaçının. - Üçüncü taraf kaynaklar için Alt Kaynak Bütünlüğü (SRI) kullanın: CDN'lerden yüklenen dosyaların bütünlüğünü doğrulayın.
- CSP'nizi güncel tutun: Web sitenizdeki ve bağımlılıklarınızdaki değişiklikleri yansıtmak için CSP'nizi düzenli olarak gözden geçirin ve güncelleyin.
- Ekibinizi eğitin: Geliştiricilerinizin ve güvenlik ekibinizin CSP'nin önemini ve nasıl doğru bir şekilde uygulanacağını anladığından emin olun.
- Bir CSP oluşturucu veya yönetim aracı kullanmayı düşünün: Bu araçlar, CSP'nizi daha kolay oluşturmanıza ve sürdürmenize yardımcı olabilir.
- CSP'nizi belgeleyin: Gelecekteki geliştiricilerin anlamasına ve sürdürmesine yardımcı olmak için CSP politikanızı ve her yönergenin arkasındaki nedenleri belgeleyin.
Sonuç
İçerik Güvenliği Politikası, XSS saldırılarını azaltmak ve web uygulamalarınızın güvenliğini artırmak için güçlü bir araçtır. Güvenilir kaynakların bir beyaz listesini dikkatlice tanımlayarak, kötü amaçlı kod yürütme riskini önemli ölçüde azaltabilir ve kullanıcılarınızı zarardan koruyabilirsiniz. CSP uygulamak zor olabilir, ancak bu makalede özetlenen en iyi uygulamaları takip ederek ve uygulamanızın ve küresel kitlenizin özel ihtiyaçlarını göz önünde bulundurarak, web sitenizi ve dünya çapındaki kullanıcılarınızı koruyan sağlam ve etkili bir güvenlik politikası oluşturabilirsiniz.
Unutmayın ki güvenlik sürekli bir süreçtir ve CSP bulmacanın sadece bir parçasıdır. Kapsamlı bir derinlemesine savunma stratejisi oluşturmak için CSP'yi girdi doğrulama, çıktı kodlama ve düzenli güvenlik denetimleri gibi diğer güvenlik önlemleriyle birleştirin.