Siteler arası betik (XSS): nasıl çalışır, nasıl durdurulur

XSS, güvenilmeyen metnin sayfaya HTML olarak yazılmasıdır. Tarayıcı senin script'inle saldırganın sızdırdığını ayırt edemez; ikisini de çalıştırır — senin origin'inde, ziyaretçinin oturumuyla.

Örnek

Zafiyetli
app.get("/search", (req, res) => {
  res.send("<h1>Results for " + req.query.q + "</h1>");
});

// client side
results.innerHTML = comment.body;
Güvenli
import escapeHtml from "escape-html";

app.get("/search", (req, res) => {
  res.send("<h1>Results for " + escapeHtml(String(req.query.q)) + "</h1>");
});

// client side
results.textContent = comment.body;
// or, when HTML is required: results.innerHTML = DOMPurify.sanitize(comment.body);

Nasıl oluşur

Yansıtılan XSS, parametresi yanıta geri yazılan hazırlanmış bir link gönderir. Kalıcı XSS payload'u — bir yorum, bir profil alanı — kaydeder ve onu görüntüleyen herkese sunar. DOM tabanlı XSS tamamen tarayıcıda; innerHTML, document.write veya insertAdjacentHTML üzerinden olur. Otomatik escape'i kapalı şablonlar render edilen her değişkeni bir adaya çevirir.

Nasıl düzeltilir

Çıktıda escape et ve enjekte edilen bir script'in yapabileceklerini sınırla.

  • Metni metin olarak bas: textContent, escape edilen şablon değişkenleri, React'in varsayılan render'ı
  • Şablon otomatik escape'ini açık tut; yalnızca temizlenmiş değerleri safe olarak işaretle
  • HTML gerçekten gerekiyorsa DOMPurify ile temizle
  • 'unsafe-inline' içermeyen bir Content-Security-Policy ve HttpOnly oturum cookie'leri ekle

RepoVerse bunu nasıl bulur

  • Yüksekİstek girdisi sayfaya HTML olarak yazılıyor

    Girdideki script, kurbanın tarayıcısında senin origin'inde ve onun oturumuyla çalışır.

    veri akışı · CWE-79

  • Yüksekİstek girdisi HTML yanıtın içinde geri gönderiliyor

    Hazırlanmış bir link, yanıtın saldırganın script'ini taşımasını sağlar; script de senin siten olarak çalışır.

    veri akışı · CWE-79

  • YüksekŞablonlarda otomatik escape kapatılmış

    Şablona basılan her değişken ham HTML olarak çıkar; sayfada gösterilen her kullanıcı alanı kalıcı veya yansıtılmış XSS olur.

    veri akışı · CWE-79

  • OrtaBir değerden HTML yazılıyor

    Bir değişken DOM'a metin olarak değil HTML olarak yazılıyor.

    örüntü

  • YüksekLink hedefi bir değerden alınıyor

    Bir `href` veya `action` değişkenden atanıyor.

    örüntü · CWE-79

  • OrtaCSP satır içi script'lere izin veriyor

    `script-src` içindeki `'unsafe-inline'`, enjekte edilen `<script>` etiketlerinin ve event handler'ların çalışmasına izin verir — CSP'nin asıl engellemek için var olduğu şey.

    web sitesi · CWE-79

Sorular

React XSS'i önler mi?
React JSX'te render edilen değerleri escape eder; bu da XSS'in çoğunu önler. dangerouslySetInnerHTML, javascript: ile başlayan href değerleri ve sunucu tarafında string kurmak bu korumayı atlar.
Content-Security-Policy XSS'e karşı yeterli mi?
İkinci bir katmandır: sıkı bir CSP enjekte edilen script'lerin çoğunun çalışmasını durdurur ama injection yine de bir hatadır. Çıktı kodlamasını düzelt ve CSP'yi koru.

İlgili

Güncellendi 2026-10-11