WEB / WEB-10.S02
Output contexts, XSS ve DOM trust boundaries
Aynı string text, HTML, attribute, JSON ve URL’de neden aynı kontrolü istemez?
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Literal title
- Local data hazır
Source ledger Tea & Bread string’ini ordinary h2.textContent için hazır tutar. Literal text seçimi henüz tamamlanmadı. İki kart aynı yerel modelin sorumluluklarıdır; gerçek DOM veya network çalıştırılmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- DOM outcome yok
- Context seçimi
Renderer final consumer context’ini seçer; bu local lookup network veya başka document message’ı değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Context selected; interpretation pending
- Local text setter
String’in kendisi h2.textContent için seçilir; HTML entity encoding veya fragment parsing yapılmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Text setter ready; no HTML parse
- Literal outcome
Selected declaration literal Text outcome’u bekler; benign markup syntax bu branch’ta yapı veya aktif kod sayılmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Literal: Tea & Bread
Markup as text
- Local data hazır
Source ledger <em>Tea & Bread</em> metnini tutar; seçilen consumer h2.textContent’tir. Bu dal formatting parser seçmez. Model birazdan tag ve entity yazımının literal kalmasını gösterecek; aktif code yoktur.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- DOM outcome yok
- Context seçimi
Renderer final consumer context’ini seçer; bu local lookup network veya başka document message’ı değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Context selected; interpretation pending
- Local text setter
String’in kendisi h2.textContent için seçilir; HTML entity encoding veya fragment parsing yapılmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Text setter ready; no HTML parse
- Literal outcome
Selected declaration literal Text outcome’u bekler; benign markup syntax bu branch’ta yapı veya aktif kod sayılmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Literal: <em>Tea & Bread</em>
HTML text source
- Local data hazır
Source Tea & Bread’dır; bu dal sabit h2 HTML source’u için entity encoding seçecektir. Sonuç bir serialization ve expected text bilgisidir; gerçek HTML parser sonucu henüz üretilecek bir gözlem değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- DOM outcome yok
- Context seçimi
Renderer final consumer context’ini seçer; bu local lookup network veya başka document message’ı değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Context selected; interpretation pending
- Local entity encode
Selected benign title HTML text source için encode edilir; native string dönüşümü gerçek parser değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Source prepared: Tea & Bread
- Expected parse boundary
Verilen h2 source’u için text sonucu Tea & Bread’dır; bu sahne gerçek HTML parser veya DOM çalıştırmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Expected h2 text: Tea & Bread
URL policy reddi
- Local data hazır
Query başlığı Tea & Bread’dır; URL candidate reader.example.net host’una giderken izinli origin atlas.example.org’dur. Yerel destination kontrolü henüz verilmedi; query encoding hiçbir host’u onaylamaz veya bağlantı başlatmaz.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- DOM outcome yok
- Context seçimi
Renderer final consumer context’ini seçer; bu local lookup network veya başka document message’ı değildir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Context selected; interpretation pending
- Local URL gate
HTTPS örnek URL’si parse edilir. İzin verilen origin ile eşleşmediği için link assignment reddedilir.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- URL denied; assignment yok
- No link outcome
DOM link değişmez ve hiçbir URL açılmaz; encoding destination approval yerine geçmez.
- Local source ledger
- Source value hazır; plain data
- Local DOM view
- Link unchanged; network yok
ROLLER · STATE · VERİ AKIŞI
Output context interpreter’ı seçer
Tea & Bread aynı string olsa da h2 text node, serialized HTML text, quoted title attribute, JSON data ve URL query farklı tüketicilere gider. h2.textContent ataması HTML parser çalıştırmaz; string’in kendisi verilmelidir. Serialized HTML source’ta ampersand, entity encoding ile korunur. Quote içindeki title attribute içinse dış quote sınırını da koruyan attribute encoder gerekir. Attribute adı da önemlidir: title gibi plain text attribute için doğru olan karar, URL veya event-handler attribute’una taşınamaz. Context, input’un nereden geldiği değil, son tüketicinin onu nasıl yorumladığıdır.
Reflected/stored ile DOM aynı eksen değildir
Reflected veri normal request/response döngüsünde geri gösterilir; stored veri persistence’tan daha sonraki görüntülemeye gelir. Bu lifetime ayrımı encoding kararını vermez: database’de tutulması user-controlled text’i trusted markup yapmaz. DOM-based risk ise client code’un source’tan aldığı değeri interpretation yapan sink’e taşımasıyla ilgilidir; reflected veya stored veri client-side DOM yoluna da girebilir. XSS için untrusted influence, executable interpretation ve document authority altında execution gibi koşulların oluşması gerekir. Buradaki harmless em formatting declaration veya Tea & Bread sonucu tek başına XSS kanıtı değildir; mekanizma ve kontrol sınırı öğretilir.
Source provenance ile sink amacı birlikte okunur
Source ledger normal URL query, fetched book JSON veya stored title alias’ını gösterebilir; source’ın aynı origin’den gelmesi title’ı HTML instruction yapmaz. Sink ledger ordinary textContent için literal text, innerHTML için fragment parsing ve URL assignment için URL parsing/policy seçimini açıklar. JavaScript data için JSON serialization bir değer representation’ı oluşturur; bunu inline script veya event-handler source’a yapıştırmak ayrı context ve escaping problemidir. Bu fixture JSON’u data olarak parse etmeyi seçer, dynamic script üretmez. URLSearchParams query value sınırını korur; URL scheme/origin/path policy’sini kendiliğinden onaylamaz. Source-to-sink adımları aynı browser’daki local işlemlerdir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Yanlış context
- Normal data kaynağı
query-title, saved-title ve json-title aynı Tea & Bread değerini taşıyor. Reflected, stored ve response lifetime’ları farklı olsa da üçü data olarak kalıyor.
- Source ve representation
- Three source aliases / trust data
- Interpreter sınırı
- Henüz değerlendirilmedi
- Görünür sonuç
- Henüz değerlendirilmedi
- Text API sınırı
Normal h2.textContent için Tea & Bread doğrudan text’tir; HTML pre-encoding gerekmiyor. HTML source için Tea & Bread representation’ı ise başka bir consumer’a aittir.
- Source ve representation
- Three source aliases / trust data
- Interpreter sınırı
- Text value ≠ serialized HTML representation
- Görünür sonuç
- Henüz değerlendirilmedi
- Yanlış görünen entity
EncodedIntoTextContentExpected Tea & Bread literal metnidir. Bu yanlış context dönüşümü başlığı bozuyor; executable XSS sonucu veya bir vulnerability’nin bulunduğu iddiası değil.
- Source ve representation
- Three source aliases / trust data
- Interpreter sınırı
- Text value ≠ serialized HTML representation
- Görünür sonuç
- Literal entity text / wrong representation
- İkinci encoding
DoubleEncoding once Tea & Bread, twice Tea &amp; Bread verir. Aynı encoder’ı tekrar çalıştırmak önceki representation’ı veri gibi işleyebilir; güven etiketi eklemez.
- Source ve representation
- Once amp; / twice amp;amp;
- Interpreter sınırı
- Text value ≠ serialized HTML representation
- Görünür sonuç
- Literal entity text / wrong representation
- Context’i açık seç
HTML text, quoted attribute, JSON data ve URL query encoder’ları aynı görev değildir. Application-owned element ve attribute adı sabit kalmalı; sink seçimi source lifetime’dan çıkarılmaz.
- Source ve representation
- Once amp; / twice amp;amp;
- Interpreter sınırı
- Source → transform → final interpreter
- Görünür sonuç
- Literal entity text / wrong representation
- Dar sonucu koru
Bu normal string örneği doğru representation farkını gösteriyor. Bütün input domain’inin güvenliği, HTML parser veya script execution doğrulanmış sayılmıyor; final interpreter ayrıca değerlendirilir.
- Source ve representation
- Once amp; / twice amp;amp;
- Interpreter sınırı
- Source → transform → final interpreter
- Görünür sonuç
- Representation known / execution unmeasured
Hedef policy’si
- Encode edilmiş URL
Owned-url ve url-denied q için aynı Tea+%26+Bread encoding’ini kullanıyor. Encoding başlığı koruyor; host’un application tarafından izinli olduğunu söylemiyor.
- Source ve representation
- Same q encoding / different origins
- Interpreter sınırı
- Henüz değerlendirilmedi
- Görünür sonuç
- Henüz değerlendirilmedi
- URL policy kararı
Policy yalnız HTTPS, Atlas origin’i ve /books path’ini seçiyor. reader.example.net adayı bu dar yerel policy’de reddediliyor; decode başarısı destination izninin yerine geçmiyor.
- Source ve representation
- Same q encoding / different origins
- Interpreter sınırı
- Owned true / reader false
- Görünür sonuç
- Henüz değerlendirilmedi
- Connection uydurma
Reddedilen URL için network veya DOM link sonucu üretilmiyor. href bir URL consumer’ıdır; HTML parse etmiyor diye destination policy ihtiyacı ortadan kalkmaz.
- Source ve representation
- Same q encoding / different origins
- Interpreter sınırı
- Owned true / reader false
- Görünür sonuç
- Local URL deny / no connection
- Markup beklentisi
Zararsız em bytes textContent’ta literal beklenir; fragmentTreeExpected ise em ve Tea & Bread Text child gösterir. Bu iki sonuç farklı interpreter seçimini anlatır.
- Source ve representation
- Literal text ≠ expected em tree
- Interpreter sınırı
- Owned true / reader false
- Görünür sonuç
- Local URL deny / no connection
- Taxonomy’yi karıştırma
Reflected/stored lifetime ile server output/client DOM interpretation iki bağımsız eksen. Stored olmak markup’a izin vermez; same-origin response da executable safety sertifikası değildir.
- Source ve representation
- Literal text ≠ expected em tree
- Interpreter sınırı
- Lifetime and interpretation independent
- Görünür sonuç
- Local URL deny / no connection
- Koşulları adlandır
Untrusted influence ve active semantics olmadan zararsız formatting farkını exploit diye adlandırmıyoruz. Bu örnekte kontrol, data kaynağı ile son interpreter’ın policy’sini ayrı tutmak.
- Source ve representation
- Literal text ≠ expected em tree
- Interpreter sınırı
- Lifetime and interpretation independent
- Görünür sonuç
- Benign structure ≠ demonstrated XSS
VARSAYIM · SINIR · KONTROL
Harmless parser sonucu güvenlik sertifikası değildir
Fixed <em> formatting text’i markup parser’a verirseniz emphasis structure beklenir; aynı bytes ordinary textContent’a verilirse markup syntax literal text olarak kalır. Bu fark data’nın instruction olarak yorumlanabildiğini anlatır, executable attack veya vulnerability reproduction oluşturmaz. Gerçek risk değerlendirmesi untrusted influence ve active semantics koşullarını ayrıca ister. Bir benign title’ın doğru görünmesi bütün input domain’inin güvenli olduğunu kanıtlamaz; source, transformation, sink ve surrounding grammar tanımlanmadan generic "escaped" etiketi yetersizdir.
Trust etiketi context bilgisinin yerine geçmez
Saved title’ın stored olması sadece persistence provenance’ını değiştirir. Aynı-origin response, JSON parse success veya HTML entity encoder’ın çalışması business identity veya bütün output context’leri için güven kanıtı değildir. HTML-text encoding sonucunu textContent’a verirseniz Tea & Bread entity metni literal görünebilir; bu double/wrong-context dönüşüm usability hatasıdır, XSS gerçekleştiği iddiası değildir. URL encoding de approved destination listesi yerine geçmez. Fixed HTTPS external example host branch’ı local allowlist’te reddedilir; hiçbir bağlantı kurulmaz. Red lens bütün bu etiketlerin hangi dar soruyu cevapladığını ayırır.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Context kontrolü
- Beş consumer seç
Bu kayıtların üreticisi finite source/encoder/policy defteridir. contexts representation ile interpretation beklentisini, sourceRows lifetime’ı, urlRows ise yerel destination kararını taşır. actualDOM=false ve actualHTMLParser=false olduğundan expected tree veya literal text yeni Browser gözlemi değildir; URL deny’de consumer’a link ataması seçilmez. Contexts aynı title için normal textContent, serialized HTML text, quoted attribute, JSON ve URL query’yi listeliyor. Her satırın representation ve interpretation alanları birlikte okunuyor.
- Output ledger
- Five representations / explicit consumers
- Context review
- Henüz değerlendirilmedi
- Regression kanıtı
- Henüz değerlendirilmedi
- Encoder sonuçlarını karşılaştır
Normal ampersand HTML text’te amp; olur; quoted title içindeki çift tırnak quot; olur. JSON string parse ve URL query decode ise asıl normal title’ı geri vermeli.
- Output ledger
- Five representations / explicit consumers
- Context review
- HTML text/attribute; JSON/URL roundtrip
- Regression kanıtı
- Henüz değerlendirilmedi
- Sink özelliğini ayır
h2.textContent parsesHTML false, innerHTML true, href ise URL policy context’i taşır. Tek escaped etiketi bu üç farklı consumer’ı açıklayamaz.
- Output ledger
- Five representations / explicit consumers
- Context review
- HTML text/attribute; JSON/URL roundtrip
- Regression kanıtı
- Text / HTML fragment / URL policy
- Source lifetime kaydı
Query, saved ve JSON title provenance’ı kaydedilirken final sink ayrıca tutuluyor. Aynı normal değer için source lifetime değişse de text binding beklenen literal sonucu korumalı.
- Output ledger
- Lifetime recorded / data remains data
- Context review
- HTML text/attribute; JSON/URL roundtrip
- Regression kanıtı
- Text / HTML fragment / URL policy
- Olumsuz kontrolü sınırla
URL deny, double encoding ve yanlış textContent representation ayrı olumsuz kontroller. Hiçbiri browser’ın script çalıştırdığı veya HTML grammar’ının tamamının sınandığı kanıtı değil.
- Output ledger
- Lifetime recorded / data remains data
- Context review
- Separate bounded negatives / no execution claim
- Regression kanıtı
- Text / HTML fragment / URL policy
- Kontrolün sorusu
Regression source, transform, sink ve interpretation alanlarını aynı data akışına bağlar. Native finite encoder sonucu ile browser parse sonucu birbirinin yerine geçirilmez.
- Output ledger
- Lifetime recorded / data remains data
- Context review
- Separate bounded negatives / no execution claim
- Regression kanıtı
- Data-flow context retained / browser separate
Eksik interpreter
- Yalnız başlığı gör
Bu kayıtların üreticisi finite source/encoder/policy defteridir. contexts representation ile interpretation beklentisini, sourceRows lifetime’ı, urlRows ise yerel destination kararını taşır. actualDOM=false ve actualHTMLParser=false olduğundan expected tree veya literal text yeni Browser gözlemi değildir; URL deny’de consumer’a link ataması seçilmez. Review yalnız Tea & Bread display metnini görüyor; source ve final setter kaydı yok. Aynı görünür text farklı representation ve interpreter yollarından çıkabilir.
- Output ledger
- Display known / sink provenance missing
- Context review
- Henüz değerlendirilmedi
- Regression kanıtı
- Henüz değerlendirilmedi
- Beklenen tree’yi ayır
BenignMarkup fragmentTreeExpected bir beklenti olarak verilmiş. Bu tree’yi gerçek DOM capture diye almak, burada çalıştırılmayan HTML parser’a sonuç atfeder.
- Output ledger
- Display known / sink provenance missing
- Context review
- Expected tree ≠ captured DOM
- Regression kanıtı
- Henüz değerlendirilmedi
- Execution sonucunu açık bırak
Display doğru olsa da actualHTMLParser false ve activeMarkup false. Bu kayıt XSS gerçekleşti veya bütün sink’ler güvenli diye sonuç vermiyor; interpreter kanıtı eksik.
- Output ledger
- Display known / sink provenance missing
- Context review
- Expected tree ≠ captured DOM
- Regression kanıtı
- Interpreter execution unmeasured
- Gerekli provenance
Source alias, transform ve final API adı gerekli. Serialized HTML ile textContent binding birbirinden ayrılmalı; URL için destination policy kararı ayrıca kaydedilmeli.
- Output ledger
- Needed: source/transform/sink/policy
- Context review
- Expected tree ≠ captured DOM
- Regression kanıtı
- Interpreter execution unmeasured
- Dar karşılaştırma yap
Normal encoder sonuçları yalnız verilen string’ler için karşılaştırılır. Eksik sink kaydı normal h2 profile’ıyla doldurulmaz; script/style context’lerine aynı güven varsayımı taşınmaz.
- Output ledger
- Needed: source/transform/sink/policy
- Context review
- Finite strings / no invented sink
- Regression kanıtı
- Interpreter execution unmeasured
- Yeni evidence sınırı
Yeni kayıt representation’ın hangi consumer’a gittiğini yanıtlamalı. Bu incelemede normal display korunur; browser execution veya genel güvenlik başarısı eklenmez.
- Output ledger
- Needed: source/transform/sink/policy
- Context review
- Finite strings / no invented sink
- Regression kanıtı
- Retain display / collect interpreter evidence
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Plain text’i plain text API’de tut
Bu kayıtların üreticisi finite source/encoder/policy defteridir. contexts representation ile interpretation beklentisini, sourceRows lifetime’ı, urlRows ise yerel destination kararını taşır. actualDOM=false ve actualHTMLParser=false olduğundan expected tree veya literal text yeni Browser gözlemi değildir; URL deny’de consumer’a link ataması seçilmez. Title için ordinary textContent veya createTextNode gibi text API tercih edilir; HTML pre-encoding yapılmaz ve element/attribute isimleri application-owned kalır. Normal title attribute DOM API ile atanıyorsa string değeri attribute value olarak kalır; serialized HTML source üretilecekse ayrı quoted attribute encoding gerekir. HTML source, URL component ve JSON data encoder’larını aynı global sanitize fonksiyonuna indirmeyin. Bu derste finite benign string’lerin transformation sonuçları native runtime’da hesaplanabilir, fakat bu gözlem bütün parser grammar’ı veya browser sink güvenliğini doğrulamaz.
Provenance ve final interpreter için regression
Review tablosu her data value için source alias, storage lifetime, transform, final sink ve expected interpretation yazar. Reflected/stored normal title aynı literal outcome’u vermeli; benign formatting declaration textContent branch’ında Text beklentisi taşımalı. JSON data’yı decode edip title string’i elde etmek, script source üretmekten ayrıdır. URL test’i percent-encoded title’ı geri çözmeli ve selected https/owned-origin/books-path policy’sini ayrıca kontrol etmelidir. Local deny branch’ı DOM link outcome’u üretmez. Actual browser HTML parsing, XSS execution veya arbitrary student code bu eğitim modelinde çalıştırılmaz; kontrol akışı ve native finite encoding evidence ayrı kaydedilir.
ŞİMDİ VAKAYA UYGULA
Doğru encoding bütün output context’lerine taşınabilir mi?
Tea & Bread başlığı textContent, HTML source, quoted title attribute, JSON ve URL query içinde farklı representation kullanıyor. Zararsız em örneği text olarak yazıldığında literal kalıyor; fragment beklentisinde ise structure oluşuyor. Storage veya aynı origin, verinin hangi interpreter’a verileceği kararını değiştirmiyor.
Vakadaki response receipt, parsing, callback ve görünür DOM sonucunu sıraya koy. Eski başlığın kalmasını bu dersteki browser state ayrımlarıyla açıklamayı dene.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Tea & Bread output context ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"title": "Tea & Bread",
"quoteTitle": "Tea & \"Bread\"",
"ordinaryElement": "h2",
"attributeName": "title",
"actualDOM": false,
"actualHTMLParser": false,
"activeMarkup": false,
"network": false
},
"sourceRows": [
{
"alias": "query-title",
"lifetime": "reflected",
"value": "Tea & Bread",
"trust": "data"
},
{
"alias": "saved-title",
"lifetime": "stored",
"value": "Tea & Bread",
"trust": "data"
},
{
"alias": "json-title",
"lifetime": "response",
"value": "Tea & Bread",
"trust": "data"
}
],
"contexts": [
{
"kind": "ordinary-textContent",
"input": "Tea & Bread",
"representation": "Tea & Bread",
"interpretation": "literal Text node",
"preEncoded": false
},
{
"kind": "serialized-HTML-text",
"input": "Tea & Bread",
"representation": "Tea & Bread",
"interpretation": "text in fixed h2 source",
"browserParsed": false
},
{
"kind": "quoted-title-attribute",
"input": "Tea & \"Bread\"",
"representation": "Tea & "Bread"",
"interpretation": "normal fixed title attribute",
"browserParsed": false
},
{
"kind": "JSON-data",
"input": "Tea & Bread",
"representation": "\"Tea & Bread\"",
"interpretation": "parsed string value; not embedded script"
},
{
"kind": "URL-query-value",
"input": "Tea & Bread",
"representation": "q=Tea+%26+Bread",
"interpretation": "one q value; policy independent"
}
],
"benignMarkup": {
"bytes": "<em>Tea & Bread</em>",
"textContentExpected": "<em>Tea & Bread</em>",
"fragmentTreeExpected": {
"tag": "em",
"children": [
{
"text": "Tea & Bread"
}
]
},
"executabilityClaim": false
},
"doubleEncoding": {
"original": "Tea & Bread",
"once": "Tea & Bread",
"twice": "Tea &amp; Bread",
"encodedIntoTextContentExpected": "Tea & Bread",
"riskClaim": "wrong representation, not executed XSS"
},
"urlPolicy": {
"scheme": "https",
"origin": "https://atlas.example.org",
"path": "/books"
},
"urlRows": [
{
"case": "owned-url",
"candidate": "https://atlas.example.org/books?q=Tea+%26+Bread",
"expected": true
},
{
"case": "url-denied",
"candidate": "https://reader.example.net/books?q=Tea+%26+Bread",
"expected": false
}
],
"sinkRows": [
{
"sink": "h2.textContent",
"parsesHTML": false,
"context": "ordinary element text"
},
{
"sink": "innerHTML",
"parsesHTML": true,
"context": "HTML fragment"
},
{
"sink": "href",
"parsesHTML": false,
"context": "URL and destination policy"
}
],
"taxonomy": {
"lifetimeAxis": [
"reflected",
"stored"
],
"interpretationAxis": [
"server output",
"client DOM"
],
"axesIndependent": true,
"benignMarkupProvesXSS": false
},
"boundaries": {
"storageMakesMarkupTrusted": false,
"sameOriginMakesMarkupTrusted": false,
"jsonIsInlineScriptEncoder": false,
"urlEncodingApprovesDestination": false,
"textContentSafeForScriptStyle": false
}
}- contexts
- Aynı harmless value için farklı representation/consumer.
- sourceRows
- Reflected/stored/response provenance data olarak kalır.
- benignMarkup
- Fixed em declaration; text ve structure beklentisi ayrı, execution yok.
- doubleEncoding
- Wrong-context display farkı; XSS sonucu iddiası değil.
- urlRows
- Fixed reserved example URL’ler sadece local policy’de okunur.
Inert fixed benign strings/markup ve expected tree; finite encoders/URL/JSON native observations. Actual HTML parser/DOM, script interpretation, vulnerability test veya network yok.
İki yanlış kanı
Database ve same-origin JSON trusted HTML’dir.
Bunlar provenance/representation bilgisi verir; final sink text ile markup interpretation’ı ayrıca belirler.
textContent her element için aynı güvenlik garantisini verir.
Bu ders ordinary h2 Text davranışını kullanır; script/style içerik context’i ayrı kurallara sahiptir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Tea & Bread önce Tea & Bread olarak encode edilip h2.textContent’e veriliyor. Görünmesi beklenen text hangisi?
- Tea & Bread; textContent her entity’yi HTML olarak decode eder.
- Tea & Bread; encoded representation literal text olur.
Gerekçeli cevabı oku
Tea & Bread; encoded representation literal text olur. — textContent bir Text node oluşturur. HTML source için önceden encoding yapılmışsa burada & metni görünür.
Aynı title neden HTML text, quoted attribute, JSON ve URL query için farklı temsil ediliyor?
Dersten seçilen artifact alanları; öğretim örneği
- contexts[1]
- {"kind":"serialized-HTML-text","input":"Tea & Bread","representation":"Tea & Bread","interpretation":"text in fixed h2 source","browserParsed":false}
- contexts[2]
- {"kind":"quoted-title-attribute","input":"Tea & \"Bread\"","representation":"Tea & "Bread"","interpretation":"normal fixed title attribute","browserParsed":false}
- contexts[3]
- {"kind":"JSON-data","input":"Tea & Bread","representation":"\"Tea & Bread\"","interpretation":"parsed string value; not embedded script"}
- contexts[4]
- {"kind":"URL-query-value","input":"Tea & Bread","representation":"q=Tea+%26+Bread","interpretation":"one q value; policy independent"}
- Her context’in syntax ve delimiter koşulları farklı.
- JSON serialization bütün output context’leri için güvenli encoder’dır.
Gerekçeli cevabı oku
Her context’in syntax ve delimiter koşulları farklı. — HTML text için &, quoted attribute için ", form query için %26 gerekebilir. JSON string serialization bunların hepsi için tek encoder değildir.
query-title, saved-title ve json-title aynı Tea & Bread verisini taşıyor. Stored veya same-origin olmak neden markup yorumlama izni vermez? URL encoding destination’ı onaylar mı?
Gerekçeli cevabı oku
Verinin storage’dan veya same-origin bir kaynaktan gelmesi, string’i güvenilir markup yapmaz. h2.textContent veriyi metin olarak gösterir; HTML fragment sink’i ise markup parse eder ve ayrı bir kontrol gerektirir. Reflected/stored ayrımı verinin ne kadar süre saklandığını, server/client ayrımı ise nerede yorumlandığını anlatır; bunlar farklı eksenlerdir. URL encoding bir query değerini doğru temsil edebilir, ancak destination policy ayrıca scheme/origin/path koşullarını denetler. Zararsız markup örneği, gerçek XSS çalıştırıldığına dair kanıt değildir.
□ Storage ve origin bilgisini markup güveni saymadım.
□ URL representation ile destination iznini ayırdım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP — XSS Prevention Cheat SheetOutput Encoding: HTML, HTML Attribute, JavaScript and URL contexts · Safe Sinks: ordinary-element textContent caveat; Dangerous Contexts
- WHATWG DOM — textContent§4.4 get/set text content and string replace all
- WHATWG HTML — Dynamic markup insertion§8.5.4 innerHTML setter and fragment parsing; §8.5.5 outerHTML
- MDN — Cross-site scripting: mechanismsClient and server XSS; Reflected and stored XSS: source/storage versus rendering