İçerik Güvenlik Politikası (CSP): XSS ve Veri Enjeksiyonunu Önleme
Content Security Policy (CSP), bir web sitesinin tarayıcıya hangi kaynaklardan içerik yükleyebileceğini ve hangi kodların çalıştırılabileceğini bildiren bir güvenlik politikası çerçevesidir. Sunucu tarafından gönderilen bir HTTP yanıt başlığı aracılığıyla iletilir ve tarayıcı, sayfayı işlerken bu kuralları uygular. Amaç, sayfaya sonradan eklenmiş zararlı içeriğin çalıştırılmasını engelleyerek kullanıcı verilerinin ve oturum bilgilerinin korunmasına katkı sağlamaktır. CSP, tek başına yeterli bir çözüm olarak değil, katmanlı güvenlik yaklaşımının bir bileşeni olarak değerlendirilir.
CSP'nin Çalışma Mantığı ve Tarayıcı Tarafındaki Rolü
Politikanın uygulanmasından sorumlu taraf tarayıcıdır. Sunucu, yanıt başlığında bir dizi kural tanımlar; tarayıcı da sayfayı oluştururken bu kurallara uygun davranır. Model, varsayılan olarak reddetme ve yalnızca açıkça izin verilen kaynakları kabul etme esasına dayanır. Bir kaynak politikada belirtilmemişse tarayıcı o kaynağı yüklemez veya çalıştırmaz. Bu yaklaşım, bir saldırganın sayfaya kod enjekte etmesi durumunda dahi enjekte edilen kodun yürütülmesini büyük ölçüde engeller.
Politika, direktif adı verilen ifadelerden oluşur. Her direktif belirli bir kaynak türünü denetler; örneğin betikler, stil dosyaları, görseller, yazı tipleri veya ağ bağlantıları. default-src direktifi, ayrıca tanımlanmamış tüm kaynak türleri için geri dönüş değeri olarak kullanılır. Dolayısıyla politikanın bütününü daha sıkı hale getirmek için öncelikle bu direktifin düzenlenmesi yaygın bir uygulamadır.
XSS Saldırıları ve CSP'nin Önleyici İşlevi
XSS (Cross-Site Scripting), saldırganın güvenilir bir web sitesinin sayfasına kendi kodunu yerleştirmesi ve bu kodun ziyaretçinin tarayıcısında çalışmasını sağlaması esasına dayanır. Enjekte edilen kod, oturum çerezlerine erişme, form verilerini okuma veya kullanıcı adına işlem başlatma gibi sonuçlar doğurabilir. CSP, tarayıcının yalnızca izin verilen kaynaklardan gelen betikleri çalıştırmasını sağlayarak bu tür girişimlerin etkisini sınırlar; çünkü enjekte edilen satır içi kod, politika tarafından engellenir.
Yansıtılan (Reflected) XSS
Kullanıcıdan alınan verinin sunucu tarafından yeterince temizlenmeden aynı yanıt içinde geri döndürülmesi durumunda ortaya çıkar. Saldırgan, hazırladığı bağlantıyı kurbana iletir; kurban bağlantıyı açtığında zararlı kod çalışır. CSP, bu senaryoda satır içi betiklerin çalıştırılmasını engelleyerek saldırının gerçekleşmesini zorlaştırır.
Kalıcı (Stored) XSS
Zararlı kodun veritabanına veya kalıcı bir depoya yazılması ve sonraki ziyaretlerde sayfa içeriğinin parçası olarak sunulması ile gerçekleşir. Etki alanı geniş olduğu için CSP'nin sağladığı savunma katmanı bu türde de önem taşır.
DOM Tabanlı XSS
Bu türde saldırı, sunucuya hiç uğramadan doğrudan tarayıcı içindeki JavaScript kodunda meydana gelir. Sayfa adresindeki parametrelerin güvenli olmayan biçimde işlenmesi sonucu oluşur. CSP, yürütülebilir betik kaynaklarını kısıtlayarak bu tür girişimlerin etkisini azaltabilir; ancak güvenli kodlama uygulamaları yine gereklidir.
Temel Politika Direktifleri
- default-src: Diğer direktifler için geri dönüş kuralıdır.
- script-src: Çalıştırılabilecek JavaScript kaynaklarını belirler.
- style-src: Yüklenebilecek stil dosyalarını tanımlar.
- img-src: Görsel kaynaklarını sınırlar.
- font-src: Yazı tipi kaynaklarını belirler.
- connect-src: XMLHttpRequest, Fetch ve WebSocket gibi bağlantıları denetler.
- frame-src ve frame-ancestors: Çerçeve içinde gösterilebilecek ve sayfayı çerçeveleyebilecek kaynakları belirler.
- object-src: Eklenti ve nesne yüklemelerini kısıtlar.
- base-uri: Sayfanın temel adresinin değiştirilmesini engeller.
- form-action: Form verilerinin gönderilebileceği hedefleri sınırlar.
- upgrade-insecure-requests: Güvensiz kaynak isteklerinin güvenli sürüme yükseltilmesini sağlar.
Politika Oluşturma ve Uygulama Adımları
- Mevcut içerik kaynaklarının envanterini çıkarın: betikler, stiller, görseller, yazı tipleri ve çağrılan servisler tespit edilir.
- Tüm kaynakları önce yalnızca raporlama modunda izleyerek kullanım haritası oluşturun.
- Güvenilir kaynakları listeleyen ilk politikayı yazın; mümkün olduğunca dar kapsam seçin.
- Satır içi betikler ve satır içi stiller için nonce veya hash yöntemini uygulayın.
- Politikayı test ortamında doğrulayın ve ihlal raporlarını inceleyin.
- Aşamalı olarak üretim ortamına alın; önce raporlama, sonra zorlama moduna geçin.
- Politikayı sürüm kontrolünde saklayın ve uygulama değişikliklerinde güncelleyin.
Nonce, Hash ve strict-dynamic Kullanımı
Satır içi betiklerin güvenli biçimde çalıştırılabilmesi için iki temel yöntem bulunur. Nonce yönteminde her yanıt için rastgele ve tekrar etmeyen bir değer üretilir; bu değer hem başlığa hem de ilgili betik etiketine eklenir. Hash yönteminde ise betiğin kriptografik özeti politikaya yazılır ve tarayıcı yalnızca özeti eşleşen betikleri çalıştırır. strict-dynamic ifadesi, güvenilir bir betiğin kendi yüklediği alt betiklerin de çalışmasına izin verir ve böylece alan adı listelerine olan bağımlılığı azaltır. Bu mekanizmalar, unsafe-inline ifadesinin kullanılmasını gereksiz kılar.
İzleme, Raporlama ve Report-Only Modu
Politikanın olası etkilerini risk almadan gözlemlemek için Content-Security-Policy-Report-Only başlığı kullanılır. Bu modda tarayıcı ihlalleri engellemez, yalnızca raporlar. Raporlar belirtilen bir toplama adresine gönderilir ve hangi kaynağın hangi direktifi ihlal ettiği bilgisini içerir. Böylece politika, gerçek trafik üzerinde gözlemlenerek kademeli biçimde sıkılaştırılabilir. Rapor toplama noktasının erişilebilir ve güvenli olması ile raporların düzenli incelenmesi, sürecin ayrılmaz parçasıdır.
Politikanın İletilme Yöntemleri
CSP, öncelikle HTTP yanıt başlığı aracılığıyla iletilir. Bazı direktifler yalnızca başlık üzerinden tanımlanabildiği için bu yöntem tercih edilen yaklaşımdır. Bununla birlikte, başlık ekleme imkânı bulunmayan durumlarda politika, sayfanın head bölümündeki bir meta etiketi ile de belirtilebilir. Meta etiketi yönteminin kapsamı daha dardır; çerçeveleme ve raporlama ile ilgili bazı direktifler bu yöntemle desteklenmez. Bu nedenle politikaların sunucu tarafında tanımlanması daha geniş bir denetim sağlar.
Veri Enjeksiyonu ve Diğer Saldırı Vektörleriyle İlişkisi
CSP'nin odağında tarayıcıda çalışan kod yer alır. Sunucu tarafındaki veri enjeksiyonu türleri, örneğin SQL enjeksiyonu veya komut enjeksiyonu, doğrudan CSP kapsamına girmez; bu sorunlar sunucu tarafında girdi doğrulama, parametreli sorgular ve yetki denetimi ile ele alınır. Buna karşın, enjekte edilen bir içeriğin tarayıcıya yansıması durumunda CSP devreye girerek etkiyi sınırlar. Bu nedenle CSP, güvenli kodlama uygulamalarının yerini almaz; onları tamamlayan bir katman olarak işlev görür.
CSP'nin Sınırları ve Tamamlayıcı Tedbirler
Hiçbir güvenlik başlığı tek başına bütün saldırıları engelleyemez. Politikada unsafe-inline veya unsafe-eval gibi gevşetici ifadelerin kullanılması koruma düzeyini düşürür. Ayrıca geniş alan adı listeleri, güvenilir olduğu varsayılan bir kaynağın ele geçirilmesi durumunda risk oluşturabilir. Bu nedenle CSP'nin yanında şu tamamlayıcı önlemler de değerlendirilir:
- Sayfa trafiğinin HTTPS üzerinden sunulması ve HSTS başlığının tanımlanması.
- İçerik türü koklamasını sınırlayan X-Content-Type-Options başlığının kullanılması.
- Harici kaynakların bütünlüğünü doğrulayan Subresource Integrity mekanizmasının uygulanması.
- Çıktı kodlaması ve girdi doğrulaması ile güvenli geliştirme pratiklerinin benimsenmesi.
- Çerezlerin HttpOnly ve Secure nitelikleriyle korunması.
- Düzenli güvenlik testleri ve bağımlılık güncellemeleri.
Bu önlemler bir arada uygulandığında tarayıcı tabanlı saldırıların etkisi azalır ve olası bir güvenlik açığının sonuçları sınırlı kalır. CSP'nin başarısı, politikaların gerçek ihtiyaçlara göre dar tanımlanmasına ve sürekli izlenmesine bağlıdır.