İçerik Güvenlik Politikası'nın (CSP) Çapraz Site Betik (XSS) saldırılarını nasıl etkili bir şekilde hafiflettiğini ve küresel bir kitle için web güvenliğini nasıl artırdığını öğrenin.
İçerik Güvenlik Politikası (CSP): XSS Önlemeye Yönelik Kapsamlı Bir Kılavuz
Günümüzün dijital ortamında, web güvenliği çok önemlidir. Çapraz Site Betik (XSS) saldırıları, web uygulamalarına yönelik yaygın ve tehlikeli bir tehdit olmaya devam etmektedir. İçerik Güvenlik Politikası (CSP), XSS güvenlik açıklarının riskini azaltmaya yardımcı olan ve ekstra bir güvenlik katmanı sağlayan güçlü bir HTTP yanıt başlığıdır. Bu kılavuz, CSP'ye, uygulamasına ve web uygulamalarınızı XSS saldırılarından korumak için en iyi uygulamalara kapsamlı bir genel bakış sunmaktadır.
Çapraz Site Betik (XSS) Nedir?
Çapraz Site Betik (XSS), kötü amaçlı betiklerin aksi takdirde iyi huylu ve güvenilir web sitelerine enjekte edildiği bir tür enjeksiyon saldırısıdır. XSS saldırıları, bir saldırganın genellikle bir tarayıcı tarafı betiği şeklinde kötü amaçlı kodu farklı bir son kullanıcıya göndermek için bir web uygulaması kullandığında meydana gelir. Bu saldırıların başarılı olmasına izin veren kusurlar oldukça yaygındır ve bir web uygulamasının, onu doğrulama veya kodlama yapmadan oluşturduğu çıktı içinde bir kullanıcıdan gelen girdiyi kullandığı her yerde meydana gelir.
Üç ana XSS saldırısı türü vardır:
- Depolanmış (Kalıcı) XSS: Kötü amaçlı betik, hedef sunucuda kalıcı olarak depolanır (örneğin, bir veritabanında, mesaj forumunda, ziyaretçi günlüğünde, yorum alanında vb.). Bir kullanıcı etkilenen sayfayı ziyaret ettiğinde, depolanan betik yürütülür.
- Yansıtılmış (Kalıcı Olmayan) XSS: Kötü amaçlı betik, bir hata mesajı, arama sonucu veya sunucuya isteğin bir parçası olarak gönderilen girdinin bir kısmını veya tamamını içeren başka herhangi bir yanıt gibi web sunucusundan yansıtılır. Kullanıcı, kötü amaçlı bir bağlantıyı tıklamak veya kötü amaçlı betiği içeren bir form göndermek için kandırılmalıdır.
- DOM tabanlı XSS: Güvenlik açığı, istemci tarafı kodunun kendisinde bulunur. Kötü amaçlı betik, tarayıcının DOM ortamı saldırganın betiğini içerecek şekilde manipüle edildiği için yürütülür.
XSS saldırılarının ciddi sonuçları olabilir, örneğin:
- Kullanıcı kimlik bilgilerini çalmak (çerezler, oturum belirteçleri).
- Web sitelerini tahrif etmek.
- Kullanıcıları kötü amaçlı sitelere yönlendirmek.
- Kötü amaçlı yazılım yüklemek.
- Hassas verilere yetkisiz erişim sağlamak.
İçerik Güvenlik Politikası (CSP) Nedir?
İçerik Güvenlik Politikası (CSP), Çapraz Site Betik (XSS) ve veri enjeksiyonu saldırıları dahil olmak üzere belirli saldırı türlerini tespit etmeye ve azaltmaya yardımcı olan ek bir güvenlik katmanıdır. CSP, belirli bir sayfa için tarayıcının yüklemesine izin verilen kaynakları (örneğin, betikler, stil sayfaları, resimler, yazı tipleri, çerçeveler) kontrol etmenizi sağlayan bir HTTP yanıt başlığı kullanılarak uygulanır. Katı bir CSP tanımlayarak, web uygulamanızın saldırı yüzeyini önemli ölçüde azaltabilir ve saldırganların kötü amaçlı kod enjekte etmesini zorlaştırabilirsiniz.
CSP, tarayıcının kaynak yüklemesine izin verilen kaynakların bir beyaz listesini tanımlayarak çalışır. CSP'de açıkça izin verilmeyen bir kaynaktan yüklenen herhangi bir kaynak tarayıcı tarafından engellenir. Bu, yetkisiz betiklerin yürütülmesini önler ve XSS saldırıları riskini azaltır.
CSP Nasıl Çalışır: Direktifler ve Kaynaklar
CSP, her biri belirli bir kaynak türü için bir politika belirten bir dizi direktif kullanılarak yapılandırılır. Her direktif, bir ad ve ardından izin verilen kaynakların bir listesinden oluşur. İşte en sık kullanılan CSP direktiflerinden bazıları:
- `default-src`: Diğer kaynağa özgü direktifler mevcut değilse, kaynakları getirmek için varsayılan politikayı belirtir.
- `script-src`: JavaScript kodu için izin verilen kaynakları belirtir.
- `style-src`: Stil sayfaları (CSS) 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.
- `connect-src`: Ağ istekleri (örneğin, AJAX, WebSockets) yapmak için izin verilen kaynakları belirtir.
- `media-src`: Video ve ses kaynaklarını yüklemek için izin verilen kaynakları belirtir.
- `object-src`: Flash gibi eklentiler için izin verilen kaynakları belirtir.
- `frame-src`: Çerçeveleri (iframe'ler) yerleştirmek 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ılara güvenli olmayan (HTTP) istekleri otomatik olarak güvenli (HTTPS) isteklere yükseltmelerini 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.
- `report-uri`: Tarayıcının CSP ihlallerinin raporlarını göndermesi gereken bir URL belirtir. `report-to` lehine kullanımdan kaldırılmıştır.
- `report-to`: Tarayıcının CSP ihlallerinin raporlarını göndermesi gereken adlandırılmış bir uç nokta belirtir.
Yaygın olarak kullanılan kaynak değerleri şunlardır:
- `*`: Herhangi bir kaynaktan kaynaklara izin verir (üretim ortamları için önerilmez).
- `'self'`: Korumalı belgeyle aynı kökenden (şema, ana bilgisayar ve bağlantı noktası) kaynaklara izin verir.
- `'none'`: Herhangi bir kaynaktan kaynak yüklenmesini engeller.
- `data:`: `data:` şeması aracılığıyla kaynak yüklenmesine izin verir (örneğin, satır içi resimler).
- `'unsafe-inline'`: Satır içi JavaScript ve CSS kullanımına izin verir (şiddetle tavsiye edilmez).
- `'unsafe-eval'`: `eval()` ve benzer işlevlerin kullanımına izin verir (şiddetle tavsiye edilmez).
- `'strict-dynamic'`: İşaretlemede bulunan bir betiğe, bir nonce veya karma eşlik ederek açıkça verilen güvenin, o kök betik tarafından yüklenen tüm betiklere yayılacağını belirtir.
- `'nonce-
'` : Eşleşen bir nonce özniteliğine sahip betiklere veya stillere izin verir. - `'sha256-
'`, `'sha384- : Eşleşen bir SHA karmasına sahip betiklere veya stillere izin verir.'`, `'sha512- '` - `https://example.com`: Belirli bir etki alanından kaynaklara izin verir.
CSP Uygulama
CSP iki temel şekilde uygulanabilir:
- HTTP Başlığı: Tercih edilen yöntem, web sunucunuzu `Content-Security-Policy` HTTP yanıt başlığını gönderecek şekilde yapılandırmaktır. Bu, web sitenizdeki her sayfa veya kaynak için CSP'yi tanımlamanıza olanak tanır.
- <meta> Etiketi: CSP, HTML belgenizin <head> bölümündeki bir <meta> etiketi kullanılarak da tanımlanabilir. Ancak, bu yöntem daha az esnektir ve HTTP başlığını kullanmaya kıyasla sınırlamaları vardır. Örneğin, `frame-ancestors`, `sandbox` ve `report-uri` direktifleri HTML meta etiketlerinde kullanılamaz.
HTTP Başlığını Kullanma
HTTP başlığını kullanarak CSP uygulamak için, web sunucunuzu yanıtlarına `Content-Security-Policy` başlığını ekleyecek şekilde yapılandırmanız gerekir. Belirli yapılandırma adımları, kullandığınız web sunucusuna bağlı olarak değişecektir.
İşte yaygın web sunucuları için örnekler:
- Apache: `.htaccess` dosyanıza veya sanal ana bilgisayar yapılandırmanıza aşağıdaki satırı ekleyin:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;"
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;";
app.use(function(req, res, next) {
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;");
next();
});
<meta> Etiketini Kullanma
<meta> etiketini kullanarak CSP uygulamak için, HTML belgenizin <head> bölümüne aşağıdaki etiketi ekleyin:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;">
Önemli Hususlar:
- `http-equiv` özniteliği "Content-Security-Policy" olarak ayarlanmalıdır.
- `content` özniteliği CSP direktiflerini içerir.
- <meta> etiketlerini kullanmanın daha önce bahsedilen sınırlamalarını unutmayın.
CSP Örnekleri
İşte açıklamalarıyla birlikte çeşitli CSP örnekleri:
- Temel CSP:
- Belirli Bir Etki Alanından Betiklere İzin Verme:
- Bir CDN'den Stilleri İzin Verme:
- Herhangi Bir Kaynaktan Görüntülere İzin Verme:
- CSP İhlallerini Raporlama:
- Uyumluluk için `report-to` ve `report-uri`'yi birlikte kullanma:
- Satır İçi Betikler İçin Nonce'lar Kullanma:
Content-Security-Policy: default-src 'self';
Bu politika, yalnızca aynı kökenden kaynaklara izin verir.
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com;
Bu politika, aynı kökenden kaynaklara ve `https://example.com` adresinden betiklere izin verir.
Content-Security-Policy: default-src 'self'; style-src 'self' https://cdn.example.com;
Bu politika, aynı kökenden kaynaklara ve `https://cdn.example.com` adresinden stillere izin verir.
Content-Security-Policy: default-src 'self'; img-src *;
Bu politika, aynı kökenden kaynaklara ve herhangi bir kaynaktan görüntülere izin verir (üretim için önerilmez).
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint;
Bu politika, aynı kökenden kaynaklara izin verir ve ihlal raporlarını `/csp-report-endpoint` adresine gönderir. `report-uri` yerine `report-to` kullanılması önerilir.
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"/csp-report-endpoint"}]}
Bu örnek, hem bir `report-uri` (eski tarayıcılar için) hem de bir `report-to` uç noktasının nasıl ayarlanacağını ve `Report-To` başlığının kendisinin nasıl yapılandırılacağını gösterir. Sunucunuzun `Report-To` başlığını doğru bir şekilde işlediğinden, `group`, `max_age` ve `endpoints` değerlerini doğru ayarladığınızdan emin olun.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-rAnd0mN0nc3Str1nG';
Bu politika, aynı kökenden kaynaklara ve eşleşen nonce özniteliğine sahip satır içi betiklere izin verir.
<script nonce="rAnd0mN0nc3Str1nG">
// Your inline script code here
</script>
Yalnızca Raporlama Modunda CSP
CSP iki modda uygulanabilir:
- Uygulama Modu: Tarayıcı, CSP'yi ihlal eden kaynakları engeller.
- Yalnızca Raporlama Modu: Tarayıcı, herhangi bir kaynağı engellemeden belirtilen bir uç noktaya CSP ihlallerini raporlar.
Yalnızca Raporlama modu, CSP'nizi uygulamadan önce test etmek ve iyileştirmek için kullanışlıdır. Yalnızca Raporlama modunu etkinleştirmek için, `Content-Security-Policy` başlığı yerine `Content-Security-Policy-Report-Only` HTTP başlığını kullanın.
Örnek:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint;
Bu yapılandırma, herhangi bir kaynağı engellemeden `/csp-report-endpoint` adresine rapor gönderecektir.
CSP Uygulamak İçin En İyi Uygulamalar
İşte CSP'yi etkili bir şekilde uygulamak için bazı en iyi uygulamalar:
- Katı Bir Politikayla Başlayın: Yalnızca aynı kökenden kaynaklara izin veren kısıtlayıcı bir politikayla başlayın ve gerektiğinde kademeli olarak gevşetin.
- Satır İçi Betikler ve Stiller İçin Nonce'lar veya Hash'ler Kullanın: `'unsafe-inline'` kullanmaktan kaçının ve belirli satır içi betiklere ve stillere izin vermek için nonce'lar veya hash'ler kullanın.
- `'unsafe-eval'`'den Kaçının: Mümkünse, güvenlik riskleri oluşturabileceğinden `'unsafe-eval'` kullanmaktan kaçının. Dinamik kod yürütme için alternatif yaklaşımları göz önünde bulundurun.
- HTTPS Kullanın: Ortadaki adam saldırılarını önlemek için tüm kaynakların HTTPS üzerinden yüklendiğinden emin olun. Güvenli olmayan istekleri otomatik olarak yükseltmek için `upgrade-insecure-requests` direktifini kullanın.
- CSP İhlallerini İzleyin: CSP ihlallerini izlemek ve potansiyel güvenlik sorunlarını belirlemek için bir raporlama uç noktası ayarlayın.
- CSP'nizi İyice Test Edin: Beklendiği gibi çalıştığından emin olmak için CSP'nizi farklı tarayıcılarda ve ortamlarda test edin.
- Yineleyin ve İyileştirin: CSP uygulaması yinelemeli bir işlemdir. Uygulamanız geliştikçe CSP'nizi sürekli olarak izleyin ve iyileştirin.
- `strict-dynamic` Direktifini Göz Önünde Bulundurun: Güvenilir betikler tarafından yüklenen betiklere güveni yayarak CSP'nizin karmaşıklığını azaltmak için `strict-dynamic` kullanın.
CSP Araçları
Çeşitli araçlar, CSP oluşturmanıza, test etmenize ve izlemenize yardımcı olabilir:
- CSP Oluşturucular: Web sitenizin kaynaklarına göre CSP direktifleri oluşturan çevrimiçi araçlar.
- Tarayıcı Geliştirici Araçları: Çoğu modern tarayıcı, CSP ihlallerini analiz etmenize yardımcı olabilecek geliştirici araçları sağlar.
- CSP İzleme Hizmetleri: CSP ihlal raporlarını toplayan ve analiz eden hizmetler.
CSP ve Çerçeveler/Kitaplıklar
Çerçeveleri ve kitaplıkları kullanırken, uyumluluğu sağlamak ve güvenlik sorunlarını önlemek için CSP'yi doğru şekilde yapılandırmak önemlidir. İşte bazı hususlar:
- JavaScript Çerçeveleri (örneğin, React, Angular, Vue.js): Bu çerçeveler genellikle satır içi stiller veya dinamik kod oluşturma kullanır ve bu da özel CSP yapılandırmaları (örneğin, nonce'lar, hash'ler, `'unsafe-eval'`) gerektirebilir.
- CSS Çerçeveleri (örneğin, Bootstrap, Tailwind CSS): Bu çerçeveler satır içi stiller veya harici stil sayfaları kullanabilir ve bunların CSP'nizde izin verilmesi gerekir.
- Üçüncü Taraf Kitaplıkları: Kullandığınız herhangi bir üçüncü taraf kitaplığının CSP'nizle uyumlu olduğundan ve güvenlik açıkları oluşturmadığından emin olun.
CSP ve CDN'ler (İçerik Dağıtım Ağları)
CDN'ler, JavaScript dosyaları, CSS stil sayfaları ve resimler gibi statik varlıkları barındırmak için yaygın olarak kullanılır. CSP'nizde CDN'lerden kaynaklara izin vermek için, CDN etki alanlarını açıkça beyaz listeye almanız gerekir.
Örnek:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' https://cdnjs.cloudflare.com;
Bu politika, jsDelivr'den betiklere ve Cloudflare'ın cdnjs'sinden stillere izin verir.
Kaçınılması Gereken Yaygın CSP Hataları
İşte kaçınılması gereken bazı yaygın CSP hataları:
- Kaynak Olarak `*` Kullanma: Herhangi bir kaynaktan kaynaklara izin vermek, CSP'nin faydalarını ortadan kaldırabilir.
- Gerekçe Olmadan `'unsafe-inline'` ve `'unsafe-eval'` Kullanma: Bu direktifler güvenlik riskleri oluşturabilir ve mümkünse kaçınılmalıdır.
- CSP İhlallerini İzlememe: CSP ihlallerini izleyememek, güvenlik sorunlarını belirlemenizi ve ele almanızı engelleyebilir.
- CSP'yi İyice Test Etmeme: Yetersiz test, beklenmedik davranışlara ve güvenlik açıklarına yol açabilir.
- Nonce'ları ve Hash'leri Yanlış Yapılandırma: Yanlış yapılandırılmış nonce'lar ve hash'ler, meşru betiklerin ve stillerin yüklenmesini engelleyebilir.
Gelişmiş CSP Kavramları
Temel bilgilerin ötesinde, çeşitli gelişmiş CSP kavramları web güvenliğinizi daha da artırabilir:
- `frame-ancestors` Direktifi: Sayfanıza bir çerçeve (iframe) yerleştirmesine izin verilen izin verilen üst öğeleri belirtir. Tıklama kaçırma saldırılarına karşı korur.
- `sandbox` Direktifi: İstenen kaynak için bir sanal alan etkinleştirir ve yeteneklerine kısıtlamalar uygular (örneğin, betik yürütmesini, form gönderimini engelleme).
- `require-sri-for` Direktifi: Harici kaynaklardan yüklenen betikler veya stiller için Alt Kaynak Bütünlüğü (SRI) gerektirir. SRI, dosyaların kurcalanmadığından emin olur.
- Güvenilir Türler API'si: DOM havuzlarında tür güvenliğini uygulayarak DOM tabanlı XSS'yi önlemeye yardımcı olur.
CSP'nin Geleceği
CSP, yeni güvenlik zorluklarını ele almak için sürekli olarak gelişmektedir. Gelecekteki gelişmeler şunları içerebilir:
- Geliştirilmiş Tarayıcı Desteği: CSP özellikleri için tarayıcı desteğinde sürekli iyileştirmeler.
- Yeni Direktifler ve Özellikler: Ortaya çıkan güvenlik tehditlerini ele almak için yeni direktiflerin ve özelliklerin tanıtımı.
- Güvenlik Araçlarıyla Entegrasyon: CSP yönetimini ve izlemesini otomatikleştirmek için güvenlik araçları ve platformlarıyla daha derin entegrasyon.
Sonuç
İçerik Güvenlik Politikası (CSP), XSS saldırılarını azaltmak ve web güvenliğini artırmak için güçlü bir araçtır. Katı bir CSP tanımlayarak, web uygulamanızın saldırı yüzeyini önemli ölçüde azaltabilir ve kullanıcılarınızı kötü amaçlı koddan koruyabilirsiniz. CSP'yi etkili bir şekilde uygulamak, dikkatli planlama, kapsamlı test ve sürekli izleme gerektirir. Bu kılavuzda özetlenen en iyi uygulamaları izleyerek, web uygulamalarınızın güvenlik duruşunu iyileştirmek ve küresel dijital ekosistemde çevrimiçi varlığınızı korumak için CSP'den yararlanabilirsiniz.
Gelişen güvenlik tehditlerine uyum sağlamak ve web uygulamalarınızın korunmaya devam etmesini sağlamak için CSP'nizi düzenli olarak gözden geçirmeyi ve güncellemeyi unutmayın.