Siteler Arası Komut Dosyası Çalıştırma (XSS) saldırılarını önlemeye ve sağlam bir ön uç güvenliği için İçerik Güvenliği Politikası (CSP) uygulamaya yönelik kapsamlı bir rehber.
Ön Uç Güvenliği: XSS Önleme ve İçerik Güvenliği Politikası (CSP)
Günümüzün web geliştirme dünyasında, ön uç güvenliği büyük önem taşımaktadır. Web uygulamaları giderek daha karmaşık ve etkileşimli hale geldikçe, çeşitli saldırılara, özellikle de Siteler Arası Komut Dosyası Çalıştırma (XSS) saldırılarına karşı daha savunmasız hale gelirler. Bu makale, XSS zafiyetlerini anlamak ve azaltmak için kapsamlı bir rehber sunmakta ve sağlam bir savunma mekanizması olarak İçerik Güvenliği Politikası'nı (CSP) uygulamayı anlatmaktadır.
Siteler Arası Komut Dosyası Çalıştırma (XSS) Saldırısını Anlamak
XSS Nedir?
Siteler Arası Komut Dosyası Çalıştırma (XSS), kötü amaçlı komut dosyalarının normalde zararsız 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 farklı bir son kullanıcıya genellikle tarayıcı tarafı komut dosyası şeklinde kötü amaçlı kod 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 bir kullanıcıdan aldığı girdiyi doğrulamadan veya kodlamadan ürettiği çıktıda kullandığı her yerde ortaya çıkar.
Kullanıcıların yorum gönderebildiği popüler bir çevrimiçi forum düşünün. Forum, kullanıcı girdisini düzgün bir şekilde temizlemezse, bir saldırgan bir yoruma kötü amaçlı bir JavaScript parçacığı enjekte edebilir. Diğer kullanıcılar bu yorumu görüntülediğinde, kötü amaçlı komut dosyası tarayıcılarında çalışır ve potansiyel olarak çerezlerini çalar, onları kimlik avı sitelerine yönlendirir veya web sitesinin görünümünü bozar.
XSS Saldırı Türleri
- Yansıyan XSS (Reflected XSS): Kötü amaçlı komut dosyası tek bir isteğe enjekte edilir. Sunucu, enjekte edilen veriyi HTTP isteğinden okur ve kullanıcıya geri yansıtarak komut dosyasının tarayıcısında çalışmasını sağlar. Bu genellikle kötü amaçlı bağlantılar içeren kimlik avı e-postaları yoluyla gerçekleştirilir.
- Depolanmış XSS (Stored XSS): Kötü amaçlı komut dosyası hedef sunucuda saklanır (örneğin, bir veritabanında, forum gönderisinde veya yorum bölümünde). Diğer kullanıcılar depolanan verilere eriştiğinde, komut dosyası tarayıcılarında çalıştırılır. Bu tür XSS, çok sayıda kullanıcıyı etkileyebileceği için özellikle tehlikelidir.
- DOM Tabanlı XSS: Zafiyet, istemci tarafı JavaScript kodunun kendisinde bulunur. Saldırı, kurbanın tarayıcısındaki DOM'u (Belge Nesne Modeli) manipüle ederek kötü amaçlı komut dosyasının çalışmasına neden olur. Bu genellikle URL'lerin veya diğer istemci tarafı verilerinin manipüle edilmesini içerir.
XSS'in Etkisi
Başarılı bir XSS saldırısının sonuçları ciddi olabilir:
- Çerez Hırsızlığı: Saldırganlar kullanıcı çerezlerini çalarak hesaplarına ve hassas bilgilerine erişim sağlayabilir.
- Hesap Ele Geçirme: Çalınan çerezlerle saldırganlar, kullanıcıları taklit edebilir ve onların adına işlemler yapabilir.
- Web Sitesinin Tahrif Edilmesi: Saldırganlar web sitesinin görünümünü değiştirerek yanlış bilgi yayabilir veya markanın itibarına zarar verebilir.
- Kimlik Avı Sitelerine Yönlendirme: Kullanıcılar, giriş bilgilerini çalan veya kötü amaçlı yazılım yükleyen sitelere yönlendirilebilir.
- Veri Sızdırma: Sayfada görüntülenen hassas veriler çalınabilir ve saldırganın sunucusuna gönderilebilir.
XSS Önleme Teknikleri
XSS saldırılarını önlemek, hem girdi doğrulamasına hem de çıktı kodlamasına odaklanan çok katmanlı bir yaklaşım gerektirir.
Girdi Doğrulama
Girdi doğrulama, kullanıcı girdisinin beklenen biçime ve veri türüne uygun olduğunu doğrulama işlemidir. XSS'e karşı kusursuz bir savunma olmasa da, saldırı yüzeyini azaltmaya yardımcı olur.
- Beyaz Liste Doğrulaması (Whitelist Validation): İzin verilen karakterler ve desenlerden oluşan katı bir küme tanımlayın. Beyaz listeye uymayan herhangi bir girdiyi reddedin. Örneğin, bir kullanıcının bir ad girmesini bekliyorsanız, yalnızca harflere, boşluklara ve muhtemelen kısa çizgilere izin verin.
- Kara Liste Doğrulaması (Blacklist Validation): Bilinen kötü amaçlı karakterleri veya desenleri belirleyip engelleyin. Ancak, kara listeler genellikle eksiktir ve zeki saldırganlar tarafından atlatılabilir. Genellikle beyaz liste doğrulaması, kara liste doğrulamasına tercih edilir.
- Veri Türü Doğrulaması: Girdinin beklenen veri türüyle (örneğin, tamsayı, e-posta adresi, URL) eşleştiğinden emin olun.
- Uzunluk Sınırları: Arabellek taşması zafiyetlerini önlemek için girdi alanlarına maksimum uzunluk sınırları koyun.
Örnek (PHP):
<?php
$username = $_POST['username'];
// Beyaz liste doğrulaması: Sadece alfanümerik karakterlere ve alt çizgilere izin ver
if (preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
// Geçerli kullanıcı adı
echo "Geçerli kullanıcı adı: " . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
} else {
// Geçersiz kullanıcı adı
echo "Geçersiz kullanıcı adı. Sadece alfanümerik karakterler ve alt çizgiler kullanılabilir.";
}
?>
Çıktı Kodlama (Escaping)
Kaçış (escaping) olarak da bilinen çıktı kodlama, özel karakterleri HTML karşılıklarına veya URL kodlanmış eşdeğerlerine dönüştürme işlemidir. Bu, tarayıcının karakterleri kod olarak yorumlamasını engeller.
- HTML Kodlama:
<
,>
,&
,"
ve'
gibi HTML'de özel anlamı olan karakterlerden kaçının. PHP'dehtmlspecialchars()
gibi fonksiyonları veya diğer dillerdeki eşdeğer yöntemleri kullanın. - URL Kodlama: Boşluklar, eğik çizgiler ve soru işaretleri gibi URL'lerde özel anlamı olan karakterleri kodlayın. PHP'de
urlencode()
gibi fonksiyonları veya diğer dillerdeki eşdeğer yöntemleri kullanın. - JavaScript Kodlama: Tek tırnak, çift tırnak ve ters eğik çizgi gibi JavaScript'te özel anlamı olan karakterlerden kaçının.
JSON.stringify()
gibi fonksiyonları veyaESAPI
(Encoder) gibi kütüphaneleri kullanın.
Örnek (JavaScript - HTML Kodlama):
function escapeHTML(str) {
let div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
}
let userInput = '<script>alert("XSS");</script>';
let encodedInput = escapeHTML(userInput);
// Kodlanmış girdiyi DOM'a yazdırın
document.getElementById('output').innerHTML = encodedInput; // Çıktı: <script>alert("XSS");</script>
Örnek (Python - HTML Kodlama):
import html
user_input = '<script>alert("XSS");</script>'
encoded_input = html.escape(user_input)
print(encoded_input) # Çıktı: <script>alert("XSS");</script>
Bağlama Duyarlı Kodlama
Kullandığınız kodlama türü, verinin görüntülendiği bağlama bağlıdır. Örneğin, veriyi bir HTML özniteliği içinde görüntülüyorsanız, HTML öznitelik kodlaması kullanmanız gerekir. Veriyi bir JavaScript dizesi içinde görüntülüyorsanız, JavaScript dize kodlaması kullanmanız gerekir.
Örnek:
<input type="text" value="<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); ?>">
Bu örnekte, URL'den alınan name
parametresinin değeri bir girdi alanının value
özniteliği içinde görüntülenmektedir. htmlspecialchars()
fonksiyonu, name
parametresindeki herhangi bir özel karakterin düzgün bir şekilde kodlanmasını sağlayarak XSS saldırılarını önler.
Şablon Motoru Kullanımı
Birçok modern web çerçevesi ve şablon motoru (ör. React, Angular, Vue.js, Twig, Jinja2) otomatik çıktı kodlama mekanizmaları sağlar. Bu motorlar, değişkenler şablonlarda işlendiğinde otomatik olarak kaçış işlemi yaparak XSS zafiyetleri riskini azaltır. Her zaman şablon motorunuzun yerleşik kaçış özelliklerini kullanın.
İçerik Güvenliği Politikası (CSP)
CSP Nedir?
İçerik Güvenliği Politikası (CSP), Siteler Arası Komut Dosyası Çalıştırma (XSS) ve veri enjeksiyonu saldırıları da dahil olmak üzere belirli saldırı türlerini tespit etmeye ve azaltmaya yardımcı olan ek bir güvenlik katmanıdır. CSP, tarayıcının kaynakları yüklemesine izin verilen kaynakların bir beyaz listesini tanımlamanıza olanak tanıyarak çalışır. Bu beyaz liste alan adlarını, protokolleri ve hatta belirli URL'leri içerebilir.
Varsayılan olarak, tarayıcılar web sayfalarının herhangi bir kaynaktan kaynak yüklemesine izin verir. CSP, kaynakların yüklenebileceği kaynakları kısıtlayarak bu varsayılan davranışı değiştirir. Bir web sitesi beyaz listede olmayan bir kaynaktan kaynak yüklemeye çalışırsa, tarayıcı isteği engeller.
CSP Nasıl Çalışır?
CSP, sunucudan tarayıcıya bir HTTP yanıt başlığı gönderilerek uygulanır. Başlık, her biri belirli bir kaynak türü için bir politika belirten bir yönerge listesi içerir.
Örnek CSP Başlığı:
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';
Bu başlık aşağıdaki politikaları tanımlar:
default-src 'self'
: Kaynakların yalnızca web sayfasıyla aynı kaynaktan (alan adı) yüklenmesine izin verir.script-src 'self' https://example.com
: JavaScript'in aynı kaynaktan vehttps://example.com
adresinden yüklenmesine izin verir.style-src 'self' https://cdn.example.com
: CSS'in aynı kaynaktan vehttps://cdn.example.com
adresinden yüklenmesine izin verir.img-src 'self' data:
: Resimlerin aynı kaynaktan ve data URI'lerinden (base64 kodlu resimler) yüklenmesine izin verir.font-src 'self'
: Yazı tiplerinin aynı kaynaktan yüklenmesine izin verir.
CSP Yönergeleri
İşte en sık kullanılan CSP yönergelerinden bazıları:
default-src
: Tüm kaynak türleri için varsayılan politikayı belirler.script-src
: JavaScript'in hangi kaynaklardan yüklenebileceğini tanımlar.style-src
: CSS'in hangi kaynaklardan yüklenebileceğini tanımlar.img-src
: Resimlerin hangi kaynaklardan yüklenebileceğini tanımlar.font-src
: Yazı tiplerinin hangi kaynaklardan yüklenebileceğini tanımlar.connect-src
: İstemcinin bağlanabileceği kaynakları tanımlar (ör. WebSockets, XMLHttpRequest aracılığıyla).media-src
: Ses ve videonun hangi kaynaklardan yüklenebileceğini tanımlar.object-src
: Eklentilerin (ör. Flash) hangi kaynaklardan yüklenebileceğini tanımlar.frame-src
: Çerçeve olarak (<frame>
,<iframe>
) gömülebilecek kaynakları tanımlar.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 güvensiz istekleri (HTTP) otomatik olarak güvenli isteklere (HTTPS) yükseltmesi talimatını verir.block-all-mixed-content
: Tarayıcının herhangi bir karışık içeriği (HTTPS üzerinden yüklenen HTTP içeriği) yüklemesini engeller.report-uri
: Bir CSP politikası ihlal edildiğinde tarayıcının ihlal raporları göndermesi gereken bir URL belirtir.report-to
: İhlal raporları göndermek için uç noktalar içeren bir `Report-To` başlığında tanımlanmış bir grup adı belirtir. `report-uri` için daha modern ve esnek bir alternatiftir.
CSP Kaynak Listesi Değerleri
Her CSP yönergesi, izin verilen kaynakları veya anahtar kelimeleri belirten bir kaynak değerleri listesi kabul eder.
'self'
: Web sayfasıyla aynı kaynaktan gelen kaynaklara izin verir.'none'
: Tüm kaynaklardan gelen kaynakları yasaklar.'unsafe-inline'
: Satır içi JavaScript ve CSS'e izin verir. XSS'e karşı korumayı zayıflattığı için mümkün olduğunca kaçınılmalıdır.'unsafe-eval'
:eval()
ve ilgili fonksiyonların kullanımına izin verir. Güvenlik zafiyetlerine yol açabileceğinden bundan da kaçınılmalıdır.'strict-dynamic'
: Bir komut dosyasına, eşlik eden nonce veya hash aracılığıyla işaretlemede açıkça verilen güvenin, o kök komut dosyası tarafından yüklenen tüm komut dosyalarına yayılacağını belirtir.https://example.com
: Belirli bir alan adından kaynaklara izin verir.*.example.com
: Belirli bir alan adının herhangi bir alt alanından kaynaklara izin verir.data:
: Data URI'lerine (base64 kodlu resimler) izin verir.mediastream:
:media-src
için `mediastream:` URI'lerine izin verir.blob:
: `blob:` URI'lerine (tarayıcının belleğinde depolanan ikili veriler için kullanılır) izin verir.filesystem:
: `filesystem:` URI'lerine (tarayıcının sanal alanlı dosya sisteminde depolanan dosyalara erişmek için kullanılır) izin verir.nonce-{random-value}
: Eşleşen birnonce
özniteliğine sahip satır içi komut dosyalarına veya stillere izin verir.sha256-{hash-value}
: Eşleşen birsha256
karmasına sahip satır içi komut dosyalarına veya stillere izin verir.
CSP Uygulama
CSP'yi uygulamanın birkaç yolu vardır:
- HTTP Başlığı: CSP'yi uygulamanın en yaygın yolu, sunucunun yanıtında
Content-Security-Policy
HTTP başlığını ayarlamaktır. - Meta Etiketi: CSP, HTML belgesinde bir
<meta>
etiketi kullanılarak da tanımlanabilir. Ancak bu yöntem daha az esnektir ve bazı sınırlamalara sahiptir (örneğin,frame-ancestors
yönergesini tanımlamak için kullanılamaz).
Örnek (CSP'yi HTTP Başlığı ile Ayarlama - Apache):
Apache yapılandırma dosyanıza (ör. .htaccess
veya httpd.conf
), aşağıdaki satırı ekleyin:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';"
Örnek (CSP'yi HTTP Başlığı ile Ayarlama - Nginx):
Nginx yapılandırma dosyanıza (ör. nginx.conf
), server
bloğuna aşağıdaki satırı ekleyin:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';";
Örnek (CSP'yi Meta Etiketi ile Ayarlama):
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';">
CSP Test Etme
CSP uygulamanızın beklendiği gibi çalıştığından emin olmak için test etmeniz çok önemlidir. Content-Security-Policy
başlığını incelemek ve herhangi bir ihlal olup olmadığını kontrol etmek için tarayıcı geliştirici araçlarını kullanabilirsiniz.
CSP Raporlama
CSP raporlamasını yapılandırmak için `report-uri` veya `report-to` yönergelerini kullanın. Bu, CSP politikası ihlal edildiğinde sunucunuzun raporlar almasını sağlar. Bu bilgiler, güvenlik zafiyetlerini belirlemek ve düzeltmek için paha biçilmez olabilir.
Örnek (report-uri ile CSP):
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint;
Örnek (report-to ile CSP - daha modern):
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://alan-adiniz.com/csp-report-endpoint"}]}
Content-Security-Policy: default-src 'self'; report-to csp-endpoint;
Sunucu tarafı uç noktası (bu örneklerde `/csp-report-endpoint`), bu JSON raporlarını alacak ve işleyecek şekilde yapılandırılmalı ve daha sonra analiz edilmek üzere günlüğe kaydedilmelidir.
CSP En İyi Uygulamaları
- Katı bir politikayla başlayın: Yalnızca aynı kaynaktan kaynaklara izin veren kısıtlayıcı bir politikayla başlayın (
default-src 'self'
). Gerektikçe politikayı yavaş yavaş gevşetin, gerektiğinde belirli kaynakları ekleyin. 'unsafe-inline'
ve'unsafe-eval'
'dan kaçının: Bu yönergeler XSS'e karşı korumayı önemli ölçüde zayıflatır. Mümkün olduğunca bunlardan kaçınmaya çalışın. Satır içi komut dosyaları ve stiller için nonce veya hash kullanın veeval()
kullanmaktan kaçının.- Satır içi komut dosyaları ve stiller için nonce veya hash kullanın: Satır içi komut dosyaları veya stiller kullanmanız gerekiyorsa, bunları beyaz listeye almak için nonce veya hash kullanın.
- CSP raporlamasını kullanın: Politika ihlal edildiğinde bildirim almak için CSP raporlamasını yapılandırın. Bu, güvenlik zafiyetlerini belirlemenize ve düzeltmenize yardımcı olacaktır.
- CSP uygulamanızı kapsamlı bir şekilde test edin:
Content-Security-Policy
başlığını incelemek ve herhangi bir ihlal olup olmadığını kontrol etmek için tarayıcı geliştirici araçlarını kullanın. - Bir CSP oluşturucu kullanın: Çeşitli çevrimiçi araçlar, özel gereksinimlerinize göre CSP başlıkları oluşturmanıza yardımcı olabilir.
- CSP raporlarını izleyin: Potansiyel güvenlik sorunlarını belirlemek ve politikanızı iyileştirmek için CSP raporlarını düzenli olarak gözden geçirin.
- CSP'nizi güncel tutun: Web siteniz geliştikçe, kaynak bağımlılıklarındaki değişiklikleri yansıtmak için CSP'nizi güncellediğinizden emin olun.
- Bir İçerik Güvenliği Politikası (CSP) linteri kullanmayı düşünün: `csp-html-webpack-plugin` gibi araçlar veya tarayıcı uzantıları, CSP yapılandırmanızı doğrulamanıza ve optimize etmenize yardımcı olabilir.
- CSP'yi Aşamalı Olarak Uygulayın (Yalnızca Rapor Modu): Başlangıçta CSP'yi `Content-Security-Policy-Report-Only` başlığını kullanarak "yalnızca rapor" modunda dağıtın. Bu, kaynakları fiilen engellemeden olası politika ihlallerini izlemenize olanak tanır. Raporları analiz ederek CSP'nizi uygulamadan önce ince ayar yapın.
Örnek (Nonce Uygulaması):
Sunucu Tarafı (Nonce Oluşturma):
<?php
$nonce = base64_encode(random_bytes(16));
?>
HTML:
<script nonce="<?php echo $nonce; ?>">
// Satır içi komut dosyanız burada
console.log('Nonce ile satır içi komut dosyası');
</script>
CSP Başlığı:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-<?php echo $nonce; ?>';
CSP ve Üçüncü Taraf Kütüphaneler
Üçüncü taraf kütüphaneleri veya CDN'leri kullanırken, alan adlarını CSP politikanıza dahil ettiğinizden emin olun. Örneğin, bir CDN'den jQuery kullanıyorsanız, CDN'nin alan adını script-src
yönergesine eklemeniz gerekir.
Ancak, tüm CDN'leri körü körüne beyaz listeye eklemek güvenlik riskleri oluşturabilir. CDN'lerden yüklenen dosyaların bütünlüğünü doğrulamak için Alt Kaynak Bütünlüğü'nü (SRI) kullanmayı düşünün.
Alt Kaynak Bütünlüğü (SRI)
SRI, tarayıcıların CDN'lerden veya diğer üçüncü taraf kaynaklardan alınan dosyaların tahrif edilmediğini doğrulamasına olanak tanıyan bir güvenlik özelliğidir. SRI, alınan dosyanın kriptografik karmasını bilinen bir karmayla karşılaştırarak çalışır. Karmalar eşleşmezse, tarayıcı dosyanın yüklenmesini engeller.
Örnek:
<script src="https://example.com/jquery.min.js" integrity="sha384-ornek-karma" crossorigin="anonymous"></script>
integrity
özniteliği, jquery.min.js
dosyasının kriptografik karmasını içerir. crossorigin
özniteliği, SRI'nin farklı kaynaklardan sunulan dosyalarla çalışması için gereklidir.
Sonuç
Ön uç güvenliği, web geliştirmenin kritik bir yönüdür. XSS önleme tekniklerini ve İçerik Güvenliği Politikası'nı (CSP) anlayıp uygulayarak, saldırı riskini önemli ölçüde azaltabilir ve kullanıcılarınızın verilerini koruyabilirsiniz. Girdi doğrulama, çıktı kodlama, CSP ve diğer en iyi güvenlik uygulamalarını birleştiren çok katmanlı bir yaklaşım benimsemeyi unutmayın. Güvenli ve sağlam web uygulamaları oluşturmak için öğrenmeye devam edin ve en son güvenlik tehditleri ve azaltma teknikleri hakkında güncel kalın.
Bu kılavuz, XSS önleme ve CSP hakkında temel bir anlayış sağlar. Güvenliğin sürekli bir süreç olduğunu ve potansiyel tehditlerin önünde kalmak için sürekli öğrenmenin gerekli olduğunu unutmayın. Bu en iyi uygulamaları uygulayarak, kullanıcılarınız için daha güvenli ve güvenilir bir web deneyimi oluşturabilirsiniz.