Özet
Siteler arası komut dosyası oluşturma (XSS) en yaygın ve tehlikeli web güvenlik açıklarından biri olmaya devam etmektedir. Modern ön uç çerçeveleri, SPA'lar (tek sayfa uygulamaları) ve zengin üçüncü taraf komut dosyası ekosistemleri hem fırsatı hem de karmaşıklığı artırmaktadır. Bu makale, OWASP XSS Önleme Hile Sayfasını son akademik ve endüstri araştırmalarıyla birleştirerek katmanlı bir savunma stratejisi oluşturmaktadır: bağlamsal kodlama, HTML sanitizasyonu, DOM XSS için dinamik kusur izleme, ayrıştırma-farklı bulanıklaştırma, İçerik Güvenliği Politikası (CSP) ve tedarik zinciri kontrolleri. Ayrıca bir tasarım öneriyoruz tek tıklamayla "XSS taraması" otomatik boru hatları, yeniden kullanılabilir tarama şablonları, çalışma zamanı enstrümantasyonu ve rapor oluşturma ile Penligent içindeki özellik. Bu belge, mühendislik teknik incelemelerine veya ürün belgelerine doğrudan dahil edilmek için uygundur.

Motivasyon
XSS güvenlik açıkları, saldırganların normalde zararsız olan web sayfalarına çalıştırılabilir komut dosyaları enjekte etmesine ve kurbanın tarayıcısında sitenin etki alanı ayrıcalıkları altında etkin bir şekilde çalışmasına olanak tanır. Bu saldırılar hassas verileri (çerezler, localStorage) dışarı sızdırabilir, yetkisiz eylemler gerçekleştirebilir veya içeriği tahrif edebilir. (MDN Web Dokümanları)
Onlarca yıllık farkındalık ve hafifletme tekniklerine rağmen, XSS kalıcı bir risk olmaya devam etmektedir. İstemci tarafı oluşturmanın, dinamik JavaScript çerçevelerinin, üçüncü taraf komut dosyalarının ve giderek daha karmaşık hale gelen şablonlama sistemlerinin yükselişi, doğruluğu garanti etmeyi zorlaştırmıştır.
Bu kılavuzun hedefleri:
- Yetkili OWASP Cheat Sheet'in pratik kurallarını güncel akademik ve mühendislik araştırmalarıyla birleştirin.
- Tek bir sihirli değnek yerine sağlam, çok katmanlı bir savunma mimarisi sunun.
- Penligent için somut bir tasarım sunmak tek tıklamayla XSS taraması araştırma ve ürün arasında köprü kurma özelliği.
Temeller: Bağlamsal Kodlama ve Güvenli Lavabolar
XSS önlemenin temel ilkesi şudur: güvenilmeyen ham verilerin yürütülebilir bir bağlama ulaşmasına asla izin vermeyin uygun kodlama veya sanitizasyon olmadan. Kodlama bağlama uygun olmalıdır (HTML gövdesi, öznitelik, JavaScript değişmezi, CSS veya URL). Bu, OWASP XSS Önleme Hile Sayfasının özüdür. (cheatsheetseries.owasp.org)
Bağlamsal Çıktı Kodlama Kuralları
| Bağlam | Güvenli Olmayan Örnek | Güvenli Kodlama / Azaltma |
|---|---|---|
| HTML metin içeriği | <div>${userInput}</div> | HTML varlık kodlaması (<, &vb.) |
| HTML özniteliği | <img src="${url}"> | Alıntı özniteliği + öznitelik kodlaması; URL şemasını doğrulama |
| JavaScript değişmezi | <script>var v = '${userInput}';</script> | JS dize kaçış (\uXXXX, escape quotes/backslashes) |
| CSS | <div style="width:${input}px"> | Sıkı doğrulama, CSS kaçışı veya dinamik CSS'ye izin vermeme |
| URL / HREF | <a href="${href}">tıklayın</a> | Percent-encode, şema beyaz listesi (http/https), kanonikleştirme |
Pratikte, her zaman yerleşik veya iyi test edilmiş kodlama kütüphanelerini tercih edin. Kendi geçici değiştirmelerinizi yapmaktan kaçının.
Güvenli Lavabolar ve Tehlikeli API'lerden Kaçınma
Doğru kodlama ile bile, bazı API'ler doğası gereği risklidir. Tehlikeli lavabolara örnek olarak şunlar verilebilir:
innerHTML,outerHTMLdocument.write,document.writelneval(),Function()kurucu- Satır içi olay işleyicileri (örn.
onclick="..."dinamik içerikli)
Güvenli alternatifleri tercih edin:
.textContentveya.innerTextmetin eklemek içinelement.setAttribute()(kontrollü öznitelik adları için)- DOM yöntemleri (örn.
appendChild,createElement) dize birleştirme olmadan
Zengin HTML Gerektiğinde HTML Sanitizasyonu
Kullanıcı tarafından sağlanan içeriğin bir miktar HTML içermesine izin verilen senaryolarda (örneğin WYSIWYG düzenleyicileri, sınırlı işaretlemeli yorumlar), sanitizasyon gereklidir. Temel yaklaşım şudur:
- Beyaz Liste izin verilen etiketler, öznitelikler ve öznitelik değeri kalıpları.
- Kırılgan özel regexler yerine olgun kütüphaneler (örn. DOMPurify) kullanın.
- Farkında olun ayrıştırma-diferansiyel saldırılar: Sanitizer'ın ayrıştırma davranışı tarayıcının HTML ayrıştırıcısından farklı olabilir, bu da baypaslara yol açabilir.
Bilinen bir araştırma hattı, temizleyicilerin ve tarayıcıların köşe harfi işaretlemesinin yorumlanmasında nasıl farklılaşabileceğini ve alternatif belirteçleştirme yoluyla kaçışları nasıl mümkün kıldığını göstermektedir. (Bkz. "Ayrıştırma Farklılıkları" araştırması)
Çalışma Zamanı Taint İzleme ile DOM Tabanlı XSS Tespiti
Sunucu tarafı teknikleri güvenilir bir şekilde yakalayamaz DOM XSS (istemci tarafı enjeksiyon), çünkü ilgili lavabo sayfa yüklendikten sonra JavaScript'te olabilir. Dinamik leke izleme (güvenilmeyen kaynakları işaretleme ve yayılmayı izleme) iyi çalışılmış bir yöntemdir.
- TT-XSS (R. Wang ve diğerleri tarafından) dinamik leke tabanlı DOM XSS tespitinin klasik bir uygulamasıdır. (科学直通车)
- Benim Kuşağım Hakkında Konuşmak hedeflenen DOM XSS açıklarını oluşturmak için dinamik veri akışı analizi kullanır. (AraştırmaGate)
- TrustyMon (2025) gerçek dünya uygulamalarındaki DOM tabanlı XSS'yi yüksek doğruluk ve düşük yanlış pozitiflerle tespit edebilen pratik bir çalışma zamanı izleme sistemini göstermektedir. (ACM Dijital Kütüphanesi)
Bu sistemler istemci tarafı yürütmeyi enstrümante eder, güvenilmeyen girdileri etiketler (örn. URL karması, sorgu parametreleri, DOM öğeleri) ve tehlikeli lavabolara ulaştıklarında tespit eder (örn. innerHTML) komut dosyasının yürütülmesiyle sonuçlanacak şekilde.
Bir uyarı: çalışma zamanı takibinin performans maliyeti vardır. Bazı çalışmalar birleştirir Ön filtre olarak ML/DNN leke izleme ek yükünü azaltmak için. Örneğin, Melicher ve diğerleri, olası savunmasız işlevleri önceden sınıflandırmak için derin öğrenmeyi kullanmayı ve yalnızca orada kusur izlemeyi uygulamayı önermektedir. (contrib.andrew.cmu.edu)
Örnek A - Sabit (güvenli lavabo kullanın textContent)
<html>
<head><title>Hoş geldiniz</title></head>
<body>
<h1>Merhaba!</h1>
<div id="greeting"></div>
<script>
function getQueryParam(name) {
return new URLSearchParams(window.location.search).get(name);
}
var raw = getQueryParam("name") || "";
// Use textContent to insert as plain text (safe)
document.getElementById("greeting").textContent = raw;
</script>
<p>Sitemize hoş geldiniz.</p>
</body>
</html>
Bu neden güvenli? textContent düz metin yazsa bile ham içerir <script>…</script>metin olarak işlenecek, yürütülmeyecektir. Ayrıca kullanarak URLSearchParams kırılgan dizin/alt dize ayrıştırmasını önler. portswigger.net

Örnek B - Öznitelik lavabosu ve güvenli URL işleme (href sözde lavabo)
Savunmasız model:
// Savunmasız:
var params = new URLSearchParams(window.location.search);
var target = params.get("url"); // kullanıcı kontrollü
document.getElementById("mylink").href = target;
Eğer hedef javascript kodudur, bağlantıya tıklandığında JS çalıştırılır.
Güvenli model (doğrulama şeması):
function safeHref(input) {
try {
var u = new URL(input, window.location.origin);
if (u.protocol === "http:" || u.protocol === "https:") {
return u.toString();
}
} catch(e) { /* invalid URL */ }
return "#";
}
document.getElementById("mylink").href = safeHref(params.get("url"));
Açıklama: yeni URL() normalleşir; biz sadece http:/https: Şemalar. Bu bloklar javascript:/veri: Şemalar. portswigger.net
İçerik Güvenliği Politikası (CSP): Derinlemesine Savunma
Kodlama ve sanitizasyon birincil savunmalar olsa da, CSP güçlü ikincil bariyer. Nonces veya hash kullanan iyi yapılandırılmış bir CSP ile birlikte katı-dinamik ve kaldırılması 'unsafe-inline'XSS istismarını büyük ölçüde kısıtlayabilir.
Ancak, tuzaklar da mevcuttur:
- Nonce yeniden kullanımı: Bazı siteler aynı nonce'u birden fazla yanıtta tekrar kullanarak CSP'nin korumalarını zayıflatmaktadır. "The Nonce-nce of Web Security" adlı yeni bir çalışma, gerçek dünyadaki pek çok sitenin bunu yaptığını göstermektedir. (arXiv)
- Dağıtım karmaşıklığı: eski satır içi komut dosyalarını, üçüncü taraf kitaplıklarını ve tarayıcı tutarsızlıklarını desteklemek genellikle politikaların gevşetilmesine yol açar.
Bu nedenle CSP, kodlama ve sanitizasyonun yerini almamalı, bunları tamamlamalıdır.
En İyi Mühendislik Uygulamaları: CI, Lint, Test, İzleme
Güçlü XSS savunmalarını operasyonel hale getirmek için:
- ESLint / Kod linterleri: izin verilmeyen lavaboların (innerHTML, eval) kullanımını yasaklayın veya işaretleyin, şablon ifadelerinde bağlam ek açıklamaları gerektirir.
- CI'da statik ve dinamik analiz:
- JS modülleri için çoklu dosya statik kusur analizi
- Fuzz testi veya diferansiyel ayrıştırma testleri
- Hazırlama ortamlarında çalışma zamanı enstrümantasyonu
- Birim / güvenlik testleri: doğru kodlamanın uygulandığından emin olmak için birim testlerinde bağlam tabanlı yükler oluşturun ("XSS Güvenlik Açıklarının Otomatik Tespiti ve Onarımı" veya "Birim Testi Yoluyla XSS Tespiti" bölümlerinde olduğu gibi) (arXiv)
- İzleme ve uyarıCSP ihlal raporlarını, şüpheli akışlar için enstrümanlı çalışma zamanı uyarılarını, kodlama hatalarının günlük metriklerini toplar.

Penligent Tek Tıkla XSS Tarama Tasarımı
Aşağıda, Penligent'in ürününe bir tasarım spesifikasyonu olarak yerleştirebileceğiniz önerilen bir tasarım spesifikasyonu bulunmaktadır tek tıklamayla XSS taraması "Playbook".
Görev İş Akışı (Üst Düzey)
- Crawl & JS oluşturma - tüm sayfaları ve JS odaklı rotaları keşfedin.
- Statik analiz - Yüksek riskli lavaboları ve işlevleri bulmak için kaynak kodunda leke yayılımı.
- Şablon tarama - yaygın XSS yüklerini ateşlemek için şablonlu tarayıcılar (örn. Nuclei) kullanın.
- Çalışma zamanı / dinamik tarama - başsız tarama ve enstrümantasyon kullanarak, yük enjekte edebilir ve komut dosyası yürütülmesini tespit edebilir.
- Çalışma zamanı kusur takibi - sayfa çalışma zamanını enstrümante edin ve güvenilmeyen verilerin tehlikeli lavabolara ulaşıp ulaşmadığını izleyin.
- Ayrıştırma-diferansiyel fuzz testi - kenar durum işaretlemesini sanitizer + tarayıcıya besleyin ve farklılıkları tespit edin.
- CSP & SRI denetimi - üstbilgileri, komut dosyası etiketlerini inceleyin, nonce'un yeniden kullanımını, eksik bütünlük niteliklerini kontrol edin.
- Rapor oluşturma - PoC'ler, risk derecelendirmesi, düzeltme önerileri ile güvenlik açıklarını bir araya getirin ve isteğe bağlı olarak PR yamaları oluşturun.
Örnek Nuclei Şablonu (Yansıtılmış XSS)
id: xss-reflect-basic
BİLGİ:
isim Yansıtılmış XSS Temel
Yazar: penligent-scan
Şiddet: yüksek
talepler:
- yöntem: GET
yol:
- "{{BaseURL}}?q={{payload}}"
payloads:
payload:
- ""
eşleştiriciler:
- tür: kelime
parça: gövde
kelimeler:
- ""
Bağlama duyarlı yük setleriyle (öznitelik, JS, URL) genişletir ve yanlış pozitifleri azaltmak için başsız doğrulamaya zincirleme yaparsınız.
Örnek Görev Tanımı (JSON)
{
"isim": "XSS QuickScan",
"adımlar": [
{"id": "crawl", "type": "crawler", "params": {"start_url": "{{hedef}}", "render_js": true}},
{"id": "statik", "tür": "static_analysis", "deps": ["crawl"], "params": {"analizciler": ["multi-file-taint"]}},
{"id": "template_scan", "type": "scanner", "deps": ["crawl"], "params": {"templates": ["xss-reflect-basic"]}},
{"id": "dinamik", "tür": "dynamic_scan", "deps": ["template_scan", "static"], "params": {"motor": "headless-instrumented"}},
{"id": "dom_taint", "type": "runtime_taint", "deps": ["dynamic"], "params": {"agent": "instrumented-browser"}},
{"id": "parsing_diff", "type": "parsing_diff", "deps": ["dinamik"], "params": {}},
{"id": "audit_csp", "type": "csp_audit", "deps": ["crawl"], "params": {}},
{"id": "rapor", "tür": "report_gen", "deps": ["dom_taint", "parsing_diff", "audit_csp"], "params": {"format": "pdf,html"}}
]
}
Rapor ve Çıktı
Her bulgu şunları içerir:
- Tür (yansıtılan / depolanan / DOM)
- Kavram kanıtı (HTTP isteği/yanıtı, DOM anlık görüntüsü, ekran görüntüsü)
- Önem derecesi puanı
- Düzeltme önerileri (örn. doğru kodlayıcı, temizleyici yapılandırması, güvenli API kullanımı)
- İsteğe bağlı olarak otomatik olarak bir yama veya PR iskeleti oluşturun
Ayrıca dahili teknik raporda ilgili literatüre (örneğin TrustyMon'a atıfta bulunma, diferansiyel makaleleri ayrıştırma) bağlantı verebilirsiniz.
Örnek Kod Parçacıkları ve En İyi Uygulamalar
İşte React benzeri bir ortamda birkaç açıklayıcı güvenli/güvensiz snippet:
Güvensiz (savunmasız)
function UserGreeting(props) { dönüş ; }Daha Güvenli Versiyon
import DOMPurify from 'dompurify';
function UserGreeting(props) {
const clean = DOMPurify.sanitize(props.userContent, {ALLOWED_TAGS: ['b','i','u','a'], ALLOWED_ATTR: ['href'] });
return <div dangerouslysetinnerhtml="{{" __html: clean }} />;
}
Ya da daha iyisi:
function UserGreeting(props) {
dönüş <div>{props.userContent}</div>; // React otomatik kaçış yapacak
}
Öznitelik değerleri için:
// Unsafe
<img src={userInput} />
// Safer
function safeUrl(u) {
const doc = new URL(u, window.location.origin);
if (doc.protocol === 'http:' || doc.protocol === 'https:') {
return doc.toString();
}
return '/'; // fallback
}
<img src={safeUrl(userInput)} />
Sonuç ve Sonraki Adımlar
Bu makale şu konuları birleştirmektedir OWASP XSS Önleme Hile Sayfası (pragmatik kurallar) ile modern araştirma yönergeleri̇ (runtime taint, parsing differential, ML prefilter) sağlam, mühendislik dostu bir savunma yaklaşımı oluşturmak için. Tek tıklamayla Penligent tarama tasarımı, bu yöntemlerin ürünleştirilmesine yardımcı olarak ekiplerin işlem hatlarını yeniden keşfetmeden güçlü savunmaları benimsemelerini kolaylaştırır.

