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
app.get("/search", (req, res) => {
res.send("<h1>Results for " + req.query.q + "</h1>");
});
// client side
results.innerHTML = comment.body;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
- Content Security Policy: gerçekten koruyan bir politika yazmakXSS'i gerçekten durduran bir Content-Security-Policy yaz: unsafe-inline ve unsafe-eval neden zayıflatır, nonce ve strict-dynamic, başlangıç politikası.
- Güvenli oturum cookie'leri: bayraklar ve giriş adımıOturum cookie'lerini güvenle ayarla: Secure, HttpOnly ve SameSite bayrakları (CWE-614, CWE-1004), session fixation'a karşı girişte oturumu yenileme, Express örnekleriyle.
- Canlı bir sitede zafiyetli JavaScript kütüphanelerini bulHerhangi bir sitede eski ve zafiyetli JavaScript kütüphanelerini bul: jQuery, lodash, Bootstrap, moment, Next.js — küçültülmüş Vite ve webpack paketlerinde bile.
Güncellendi 2026-10-11