XSS (Cross-Site Scripting) nedir ve nasıl korunulur? (savunma odaklı)

XSS, saldırganın senin sitene başka kullanıcıların tarayıcısında çalışacak kod sokabilmesidir. Örneğin yorum alanına yazılan zararlı bir script, o yorumu görüntüleyen herkeste çalışır: çerez çalma, sahte form, hesap ele geçirme.

Üç tür (kısaca)

  • Stored (kalıcı): Zararlı kod veritabanına kaydedilir (yorum, profil). En tehlikelisi.
  • Reflected (yansıyan): Zararlı kod bağlantıdaki parametreden gelir, sayfaya yansır.
  • DOM tabanlı: Tamamen tarayıcıdaki JavaScript içinde oluşur.

Korunma: üç altın kural

1. Çıktıyı kaçışla (escape/encode). Kullanıcıdan gelen veriyi sayfaya basarken HTML olarak değil, metin olarak bas.

  • Modern şablon motorları (React/JSX, Vue, Jinja2, ERB) bunu varsayılan olarak yapar. Güvenli yol: onların otomatik kaçışına güven.
  • Tehlikeli olan: innerHTML, React’te dangerouslySetInnerHTML, Vue’da v-html. Bunları kullanıcı verisiyle kullanma.
// YANLIŞ: kullanıcı verisini HTML olarak basmak
el.innerHTML = kullaniciMesaji;
// DOĞRU: metin olarak basmak
el.textContent = kullaniciMesaji;

2. İçerik Güvenlik Politikası (CSP) ekle. Sayfanın hangi kaynaklardan script çalıştırabileceğini sınırlar. XSS girse bile zararı kısıtlar:

Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'

3. Çerezleri koru. Oturum çerezine HttpOnly ekle; böylece JavaScript çerezi okuyamaz, XSS ile çalınamaz. Secure ve SameSite de ekle.

HTML’e kullanıcı içeriği basmak zorundaysan (zengin metin)

Kendin temizlemeye çalışma; DOMPurify gibi test edilmiş bir kütüphane kullan:

el.innerHTML = DOMPurify.sanitize(kullaniciHtml);

Kendi uygulamanı test etmek için PortSwigger’ın ücretsiz XSS laboratuvarlarını (yasal ortam) kullanabilirsin.