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’tedangerouslySetInnerHTML, Vue’dav-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.