Reklam Alanı
Siber Güvenlik
Siber Güvenlik

Cross-Site Scripting (XSS): Stored, Reflected ve DOM Tabanlı Farkları

10 Eylül 2026 · 4 dk okuma · 14 okunma

Cross-Site Scripting, saldırganın kurbanın tarayıcısında, kurbanın oturum bağlamı içinde çalışacak istenmeyen JavaScript kodu çalıştırmasını sağlayan bir zafiyet sınıfıdır. Üç alt tür arasındaki fark genellikle "ne kadar tehlikeli" sorusundan çok "payload nerede saklanıyor ve nasıl tetikleniyor" sorusuna dayanır; bu ayrım doğru savunma stratejisini seçmek için belirleyicidir.

Stored XSS: kalıcı ve geniş etkili

Stored (depolanan) XSS'te kötü amaçlı script, sunucu tarafında bir veri deposuna (veritabanı, dosya, önbellek) kalıcı olarak yazılır ve bu veriyi görüntüleyen her kullanıcıya sunucu tarafından servis edilir. Klasik örnek, bir blog yorum formunun HTML etiketlerini filtrelemeden veritabanına kaydetmesi ve daha sonra bu yorumu okuyan her ziyaretçinin tarayıcısında çalıştırmasıdır. Etkisi geniştir çünkü saldırganın kurbanla doğrudan etkileşime girmesine (özel bir link göndermesine) gerek yoktur; sayfayı ziyaret eden herkes otomatik olarak etkilenir.

Reflected XSS: anlık ve hedefli

Reflected (yansıyan) XSS'te payload kalıcı olarak saklanmaz; sunucu, bir istek parametresini (örneğin arama kutusu sorgusunu) hiçbir kodlama yapmadan doğrudan yanıt sayfasına "yansıtır". Saldırgan bu durumda kurbanı, payload'ı zaten içeren özel olarak hazırlanmış bir bağlantıya tıklamaya ikna etmelidir (tipik olarak e-posta veya mesajla oltalama yoluyla); bu yüzden etki, tıklayan bireysel kullanıcıyla sınırlıdır ama sosyal mühendislikle birleştiğinde hedefli saldırılarda etkilidir.

DOM tabanlı XSS: sunucunun hiç görmediği zafiyet

DOM tabanlı XSS diğer ikisinden temelde farklıdır: zafiyet tamamen istemci tarafı JavaScript kodunun içinde oluşur. Sayfadaki bir script, location.hash, document.URL veya window.name gibi tarayıcı kaynaklı bir değeri okuyup, bu değeri güvensiz bir "sink" fonksiyonuna (örneğin innerHTML) hiçbir sanitizasyon yapmadan yazdığında ortaya çıkar. Kritik nokta şudur: sunucu bu payload'ı hiçbir zaman görmeyebilir, çünkü URL fragment'i (# sonrası) tarayıcı tarafından sunucuya gönderilmez; bu yüzden sunucu taraflı loglar veya WAF bu saldırıyı tespit edemez.

// GÜVENSİZ: URL parçası doğrudan DOM'a yazılıyor
const params = new URLSearchParams(location.hash.slice(1));
document.getElementById('greeting').innerHTML = 'Merhaba ' + params.get('isim');

// GÜVENLİ: metin olarak yazılıyor, HTML olarak yorumlanmıyor
document.getElementById('greeting').textContent = 'Merhaba ' + params.get('isim');
TürPayload nerede saklanırSunucu payload'ı görür mü
StoredVeritabanı / kalıcı depoEvet
Reflectedİstek parametresi (URL)Evet
DOM tabanlıTarayıcı kaynağı (hash, URL)Genellikle hayır

Bağlama duyarlı savunma

Tüm türler için ortak ilke, kullanıcıdan gelen veya kullanıcı kaynaklı değerin, yazıldığı bağlama uygun şekilde kodlanmasıdır: HTML gövdesine yazılan veri HTML entity kodlamasından, bir JavaScript string'i içine yazılan veri JS kaçış kurallarından, bir URL parametresi ise URL kodlamasından geçirilmelidir. Zengin HTML içeriğine (örneğin bir blog editörünün ürettiği biçimlendirilmiş metne) izin verilmesi gerektiğinde, DOMPurify gibi beyaz liste tabanlı bir sanitizasyon kütüphanesi kullanılmalı, kendi regex tabanlı filtreleme kodu yazılmamalıdır. Content-Security-Policy (CSP) başlığı, script kaynaklarını kısıtlayarak zafiyet istismar edilse bile inline script çalışmasını engelleyen ek bir savunma katmanı sunar; oturum çerezlerinin HttpOnly bayrağıyla işaretlenmesi ise başarılı bir XSS'in doğrudan oturum çalmaya dönüşmesini zorlaştırır. Diğer web uygulama zafiyetleri için siber güvenlik yazılarımıza bakabilirsiniz.

İlgili Yazılar