WEB / WEB-10.S03
Escaping, sanitization, CSP ve Trusted Types
Text escaping, formatting policy ve typed sink enforcement neden farklı kontrol katmanlarıdır?
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Vetted rich text
- Local başlangıç
Fixed p/class/em tree’si ve atlas-rich-text policy declaration’ı yerel defterde hazırdır. Formatting projection, revision ve sink type kararı henüz tamamlanmadı. Gerçek sanitizer, TrustedHTML instance veya browser enforcement çalıştırılmaz.
- Local UI path
- Input hazır; render yok
- Local policy gate
- Gate pending; approved value yok
- Local path seçimi
UI plain text veya declared rich-text sink yolunu seçer; iki yolun interpretation sınırı farklıdır.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Gate pending; approved value yok
- Local formatting gate
Verilen tree projection, p/em yapısını korur ve class’ı kaldırır. Bu sahne gerçek HTML sanitizer çalıştırmaz.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Projected tree approved; revision=1
- Local type declaration
Allowed atlas-rich-text policy’sinin TrustedHTML declaration’ı selected sink için kabul edilir; real brand yoktur.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Declared TrustedHTML accepted
- Expected rich outcome
UI, incelenmiş revision için p/em tree sonucunu gösterir. Parse veya browser Trusted Types enforcement çalıştırılmış değildir.
- Local UI path
- Expected p/em text: Tea & Bread
- Local policy gate
- Declared TrustedHTML accepted
Plain text
- Local başlangıç
Tea & Bread plain title’ı için h2.textContent string yolu seçilmiştir. Bu dal rich formatting parser’a veya HTML type gate’ine gitmeyecektir. Literal outcome yerel modelin beklentisidir; gerçek DOM ölçümü yoktur.
- Local UI path
- Input hazır; render yok
- Local policy gate
- Gate pending; approved value yok
- Local path seçimi
UI plain text veya declared rich-text sink yolunu seçer; iki yolun interpretation sınırı farklıdır.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Gate pending; approved value yok
- Local text gate
h2.textContent, HTML interpretation sink’i değildir; bu profile’ın TrustedHTML requirement’ı bu yolda aranmaz.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Text path allowed; HTML gate irrelevant
- Literal text outcome
Original Tea & Bread plain text outcome’u beklenir; pre-encoding veya rich formatting parse yapılmaz.
- Local UI path
- Expected literal: Tea & Bread
- Local policy gate
- Text path allowed; HTML gate irrelevant
Type mismatch
- Local başlangıç
Rich HTML sink’i için input yalnız string olarak declared edilmiştir. Seçilen supporting/enforce/no-default profile type kontrolünü birazdan uygulayacaktır. Henüz approved value veya yeni rich tree yoktur; gerçek browser sink çağrısı yapılmaz.
- Local UI path
- Input hazır; render yok
- Local policy gate
- Gate pending; approved value yok
- Local path seçimi
UI plain text veya declared rich-text sink yolunu seçer; iki yolun interpretation sınırı farklıdır.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Gate pending; approved value yok
- Local enforced type gate
Supporting/enforce/no-default profile plain string’in selected innerHTML sink’ine girişini reddeder.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Type mismatch denied; no approved value
- DOM unchanged
UI yeni rich tree oluşturmaz; harmless declaration için local denial gösterilir, executable payload yoktur.
- Local UI path
- Render unchanged; local denied
- Local policy gate
- Type mismatch denied; no approved value
Policy reddi
- Local başlangıç
Rich input other-policy adıyla declared edilmiştir; izinli policy atlas-rich-text’tir. Yerel policy-name kontrolü henüz sonuçlanmadı. Tip adı tek başına creation izni veya sanitizer doğruluğu sağlamaz.
- Local UI path
- Input hazır; render yok
- Local policy gate
- Gate pending; approved value yok
- Local path seçimi
UI plain text veya declared rich-text sink yolunu seçer; iki yolun interpretation sınırı farklıdır.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Gate pending; approved value yok
- Local policy name gate
other-policy, izin verilen policy listesinde yoktur; bu policy creation kabul edilmez.
- Local UI path
- Path selected; sink pending
- Local policy gate
- Policy creation denied; no value
- No rich render
Approved typed value oluşmadığı için UI render outcome’u değişmez; bu authorization veya sanitizer test sonucu değildir.
- Local UI path
- Render unchanged; policy denied
- Local policy gate
- Policy creation denied; no value
ROLLER · STATE · VERİ AKIŞI
Autoescaping hangi context’te korur?
Template autoescaping, title’ı output grammar içinde data olarak tutar; application’daki bütün alanları trusted output yapmaz. Plain title için text rendering varsayılan olabilir; rich text için bu yoldan çıkmak ayrı inceleme gerektirir. React’in raw HTML prop’u gibi escape hatch’ler HTML sink’ini geri getirir. Aynı framework içinde olmak, sink’in interpretation’ını kaldırmaz. Framework URL handling’i de application’ın izin verdiği destination policy’sinin yerine geçmez. Ledger, plain text, raw HTML ve policy’ye uygun rich text için gereken kontrolleri ayırır; gerçek framework render etmez.
Sanitization formatting contract’ıdır
Rich text gerçekten p/em/strong structure istiyorsa yalnız entity encode etmek formatting’i text’e çevirir. Sanitization parse edilmiş içeriği seçilmiş tag/attribute/URL policy’ye göre sınırlar; string içinde birkaç kelime silmek HTML grammar’ını çözmez. Atlas’ın benign p/class/em declaration’ında policy p/em/strong’a izin verir, attribute kabul etmez; class="note" style bilgisi kaldırılır ve Tea & Bread text’i korunur. Bu expected tree projection gerçek HTML sanitizer değildir. Approved library/configuration’ın browser parsing davranışı, version’ı ve subsequent mutation’ı ayrı doğrulanmalıdır; sanitized result’a sonradan yeni markup eklemek önceki review’ün kapsamını değiştirir.
CSP ile Trusted Types ayrı gates’tir
CSP script/resource policy’si execution/loading seçeneklerini sınırlar; untrusted HTML’i sanitize etmez veya business permission vermez. Report-only policy monitor eder, enforce sonucu değildir. Trusted Types ise selected injection sink’lerinde beklenen type/policy conversion sınırını uygular. require-trusted-types-for sink enforcement ile trusted-types approved policy-name kontrolü farklı directive’lerdir. TrustedHTML brand, policy’nin içeriği gerçekten güvenli seçtiği anlamını browser adına otomatik hesaplamaz; policy callback security-critical kalır. Seçilmiş profile supporting browser/enforce/no-default-policy/no-author-parser-options varsayar: raw string HTML sink’te reddedilir, approved sanitized alias kabul edilir. Current draft/implementation coverage ve alternate parser-options yolları bu dar profile’dan genellenmez.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Brand varsayımı
- Formatting policy
Input tree p üzerindeki class note ile em child taşıyor. Projected tree p/em formatting’ini koruyup class’ı kaldırıyor; bu bilinen tree dönüşümü tam HTML sanitizer değildir.
- Rich text ledger
- p/em retained / class removed
- Type ve policy gate
- Henüz değerlendirilmedi
- Kabul kapsamı
- Henüz değerlendirilmedi
- Typed gate koşulları
Normal innerHTML satırı TrustedHTML, atlas-rich-text, revision 1 ve policyCreated true taşıyor. Bu declared koşullar gate’in kabul beklentisi; branded instance gerçekten üretilmiş değil.
- Rich text ledger
- p/em retained / class removed
- Type ve policy gate
- Normal declared gate accepted true
- Kabul kapsamı
- Henüz değerlendirilmedi
- Brand’in dar anlamı
Browser brand check’i callback’in bütün data policy’sini bağımsız incelemez. BrandMeansSanitized false; kabul etiketi rich text’in doğru dönüştürüldüğü veya server izni olduğu sonucunu vermez.
- Rich text ledger
- p/em retained / class removed
- Type ve policy gate
- Normal declared gate accepted true
- Kabul kapsamı
- Declared brand ≠ sanitizer correctness
- Raw string karşılaştırması
Type-mismatch innerHTML’a string taşır ve enforce/no-default profile’da expected false. Normal h2.textContent string satırı expected true; iki sink aynı type gereksinimi taşımıyor.
- Rich text ledger
- innerHTML string false / textContent string true
- Type ve policy gate
- Normal declared gate accepted true
- Kabul kapsamı
- Declared brand ≠ sanitizer correctness
- Policy creation ayrımı
Other-policy için policyCreated false ve expected false. İzinli ad, gözden geçirilmiş revision ve doğru sink type ayrı koşullar; birinin görünmesi diğerini doldurmuyor.
- Rich text ledger
- innerHTML string false / textContent string true
- Type ve policy gate
- Name/revision/type remain separate
- Kabul kapsamı
- Declared brand ≠ sanitizer correctness
- Transformation’ı ayrıca incele
Plain text default yolunda kalıyor; rich text istisnası kendi formatting ve final-tree review’ünü ister. Type gate, CSP veya storage bu semantic review’ün yerine konmuyor.
- Rich text ledger
- innerHTML string false / textContent string true
- Type ve policy gate
- Name/revision/type remain separate
- Kabul kapsamı
- Type gate ≠ final-tree approval
Sonraki değişiklik
- Review edilen tree
Revision 1 projected tree izinli p/em ve boş attributes taşıyor. Bu revision’ın sonucu daha sonra değişirse önceki review artık yeni final tree’yi tarif etmez.
- Rich text ledger
- Reviewed revision 1 / projected tree
- Type ve policy gate
- Henüz değerlendirilmedi
- Kabul kapsamı
- Henüz değerlendirilmedi
- Mutation varsayımı
postSanitizeMutationRetainsReview false. Sonraki pipeline’ın ekleme veya yeniden yorumlaması aynı policy adıyla otomatik onaylanmaz; final interpreter’a giden değer yeniden incelenir.
- Rich text ledger
- Reviewed revision 1 / projected tree
- Type ve policy gate
- Later mutation invalidates prior review scope
- Kabul kapsamı
- Henüz değerlendirilmedi
- CSP’nin başka görevi
Self source enforce satırı matched true ve blocked false verir. İzinli script source rich text semantics’ini onaylamaz; cspSanitizesHTML false olarak ayrı tutuluyor.
- Rich text ledger
- Reviewed revision 1 / projected tree
- Type ve policy gate
- Later mutation invalidates prior review scope
- Kabul kapsamı
- Allowed source ≠ sanitized data
- Report ile enforce
External source enforce blocked true, report disposition blocked false verir; ikisi diagnostic true. Diagnostic varlığı aynı block sonucu veya gerçek rapor teslimi demek değildir.
- Rich text ledger
- Enforce blocks / report only diagnoses
- Type ve policy gate
- Later mutation invalidates prior review scope
- Kabul kapsamı
- Allowed source ≠ sanitized data
- Support ve default policy
Bu profil supportDeclared true, defaultPolicy false ve htmlDocument true varsayar. Başka browser veya default policy davranışı bu dar type tablosundan genellenmez.
- Rich text ledger
- Enforce blocks / report only diagnoses
- Type ve policy gate
- Supported enforce / no default assumed
- Kabul kapsamı
- Allowed source ≠ sanitized data
- Kabulün sınırı
Final tree, correct type, policy creation ve enforcement ayrı sorular. Hepsi için uygun evidence olmadan bütün site güvenli veya framework sanitize etti sonucuna varılmıyor.
- Rich text ledger
- Enforce blocks / report only diagnoses
- Type ve policy gate
- Supported enforce / no default assumed
- Kabul kapsamı
- Separate semantic/type/enforcement evidence
VARSAYIM · SINIR · KONTROL
Approved type etiketinden fazla sonuç çıkarmak
Bir policy name’in allowed olması createHTML callback’in doğru sanitize yaptığını kanıtlamaz. Benzer şekilde TrustedHTML olarak declared result whole-site XSS safety veya server authorization kanıtı değildir. Riskli varsayım browser brand check’inin tüm rich text policy’sini bağımsız denetlediğidir; browser selected sink’e typed value geldiğini kontrol eder, application hangi transformation’ı trusted sayacağını belirler. Artifact bu yüzden input tree, projected tree, policy alias, revision ve sink type’ını ayrı tutar. Burada real TrustedHTML instance üretilmediği açıkça yazılır; type declaration model scope’udur.
Sonraki mutation eski kontrollere ait değildir
Sanitized rich text’e başka pipeline’ın raw markup’ını eklemek veya library’nin sonucu yeniden yorumlaması review edilmiş final tree’yi değiştirir. CSP header varlığı bu mutation’ın doğru olduğunu söylemez; normal script-src allow sonucu data semantics’ini onaylamaz. Raw string mismatch branch’ı harmless fixed markup ile çalışır ve yalnız selected enforce/no-default gate’inin reddini gösterir; executable payload veya bypass variant yoktur. Report-only mismatch aynı block sonucu vermez, unsupported browser da aynı enforcement’a sahip kabul edilmez. Evidence policy disposition ve feature support’u belirtmeden "Trusted Types var" demek yeterli değildir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Type kontrolleri
- Normal formatting çıktısı
Tree projector yalnız verilen inputTree’yi allowedTags/allowedAttributes ile karşılaştırır; TT ve CSP tabloları da declared type/policy/disposition koşullarını hesaplar. Diagnostic=true, reportDelivered veya actualExecution anlamına gelmez. type-mismatch ile policy-denied farklı yerel karar nedenleridir; bu defter gerçek sanitizer ya da Browser enforcement üreticisi değildir. Input tree ile projected tree karşılaştırılır: p ve em kalır, class çıkarılır, text Tea & Bread korunur. AllowedAttributes boş; bu tree projection yalnız verilen structure’ı işler.
- Tree ve gate ledger
- Text retained / tags retained / attrs empty
- Kontrol karşılaştırması
- Henüz değerlendirilmedi
- Evidence sonucu
- Henüz değerlendirilmedi
- Dört type satırı
Normal rich type ve plain text expected true; innerHTML string ile other-policy expected false. Sonuçlar sink/type/policy üçlüsüne bağlanır; tek trusted etiketi altında birleşmez.
- Tree ve gate ledger
- Text retained / tags retained / attrs empty
- Kontrol karşılaştırması
- Two accepted / two distinct rejects
- Evidence sonucu
- Henüz değerlendirilmedi
- CSP controls kaydı
Self enforce normal kontrolü, external enforce deny ve external report continuation ayrı tutuluyor. reportDelivered false, actualExecution false; Boolean model sonucu bu alanları değiştirmiyor.
- Tree ve gate ledger
- Text retained / tags retained / attrs empty
- Kontrol karşılaştırması
- Two accepted / two distinct rejects
- Evidence sonucu
- Source/disposition controls / no execution
- Revision bağını kaydet
atlas-rich-text revision 1 ile hangi projected tree’nin gözden geçirildiği açık tutulur. Stored source, approved result ve final sink verisi aynı nesne veya aynı kanıt gibi ele alınmaz.
- Tree ve gate ledger
- Source/result/revision/sink distinct
- Kontrol karşılaştırması
- Two accepted / two distinct rejects
- Evidence sonucu
- Source/disposition controls / no execution
- Native sınırını koru
Finite tree projector text ve attributes’i hesaplayabilir; HTML grammar’ını sanitize ettiğini kanıtlamaz. ActualSanitizer ve actualTrustedTypes false; browser brand nesnesi burada yok.
- Tree ve gate ledger
- Source/result/revision/sink distinct
- Kontrol karşılaştırması
- Finite projector ≠ sanitizer/TrustedHTML runtime
- Evidence sonucu
- Source/disposition controls / no execution
- Regression sorularını ayır
Kontrol final text/tree, type gate ve disposition’ı ayrı doğrulamalı. Böylece bir normal string’in doğru görünmesi sanitizer, CSP ve framework başarısı yerine kullanılmıyor.
- Tree ve gate ledger
- Source/result/revision/sink distinct
- Kontrol karşılaştırması
- Finite projector ≠ sanitizer/TrustedHTML runtime
- Evidence sonucu
- Separate tree/type/disposition regressions
Type kaydı eksik
- Yalnız policy adı
Tree projector yalnız verilen inputTree’yi allowedTags/allowedAttributes ile karşılaştırır; TT ve CSP tabloları da declared type/policy/disposition koşullarını hesaplar. Diagnostic=true, reportDelivered veya actualExecution anlamına gelmez. type-mismatch ile policy-denied farklı yerel karar nedenleridir; bu defter gerçek sanitizer ya da Browser enforcement üreticisi değildir. Review yalnız atlas-rich-text adını görüyor; final value, sink ve disposition yok. Adın izinli oluşu policy creation, callback sonucu veya browser brand creation’ı tek başına kanıtlamıyor.
- Tree ve gate ledger
- Name known / value/sink/disposition missing
- Kontrol karşılaştırması
- Henüz değerlendirilmedi
- Evidence sonucu
- Henüz değerlendirilmedi
- Declared sonucu ayır
Normal row typeDeclared TrustedHTML gösteriyor; brandedInstanceCreated false. Declaration’ı browser’ın kabul ettiği instance diye kopyalamak gözlenmeyen runtime sonucunu ekler.
- Tree ve gate ledger
- Name known / value/sink/disposition missing
- Kontrol karşılaştırması
- Declaration ≠ created branded instance
- Evidence sonucu
- Henüz değerlendirilmedi
- Semantic sonucu belirsiz tut
Bu eksik kayıt için sanitizer correctness ve final sink acceptance UNKNOWN. Policy adı doğru olsa da final tree veya sonraki mutation bilinmeden semantic başarı söylenemiyor.
- Tree ve gate ledger
- Name known / value/sink/disposition missing
- Kontrol karşılaştırması
- Declaration ≠ created branded instance
- Evidence sonucu
- Sanitizer/sink acceptance UNKNOWN
- Gerekli alanları topla
Sink, value type, policy creation, revision, support ve enforcement disposition gerekli. Rich text için final tree ve attributes de kaydedilir; private body taşımak gerekmez.
- Tree ve gate ledger
- Needed: tree/type/policy/revision/disposition
- Kontrol karşılaştırması
- Declaration ≠ created branded instance
- Evidence sonucu
- Sanitizer/sink acceptance UNKNOWN
- Olumlu kontrolü koru
Plain text ve normal rich result farklı olumlu kontroller. Raw-string mismatch ve denied policy ayrı olumsuzlar; eksik browser kaydını bu beklentilerle doldurmuyoruz.
- Tree ve gate ledger
- Needed: tree/type/policy/revision/disposition
- Kontrol karşılaştırması
- Positive/negative controls retained
- Evidence sonucu
- Sanitizer/sink acceptance UNKNOWN
- Yeni kanıtın sınırı
Yeni inceleme type gate ile transformation sonucunu ayrı yanıtlamalı. Bu kayıt yalnız policy adını koruyor; browser enforcement veya sanitizer başarısı için yeni iddia üretmiyor.
- Tree ve gate ledger
- Needed: tree/type/policy/revision/disposition
- Kontrol karşılaştırması
- Positive/negative controls retained
- Evidence sonucu
- Name retained / collect scoped runtime evidence
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Text default, rich text exception
Tree projector yalnız verilen inputTree’yi allowedTags/allowedAttributes ile karşılaştırır; TT ve CSP tabloları da declared type/policy/disposition koşullarını hesaplar. Diagnostic=true, reportDelivered veya actualExecution anlamına gelmez. type-mismatch ile policy-denied farklı yerel karar nedenleridir; bu defter gerçek sanitizer ya da Browser enforcement üreticisi değildir. Plain title için ordinary text API kullanılır; rich text isteyen tek renderer explicit tag/attribute policy’sini own eder. Sanitizer’ı browser grammar’ını anlayan maintained implementation’dan seçmek ve configuration’ı pin etmek gerekir; bu dersin finite tree projector’ı onun yerine kullanılmaz. Allowed p/em/strong örneği formatting’i korurken disallowed benign class’ı kaldırmayı bekler; text-only branch ise markup parser’a hiç gitmez. Regression yalnız expected text’i değil izinli tree/attribute sonucunu da gözlemlemelidir. Storage’daki source value ile approved render result revision’ı ayrı tutulur.
Type gate ve CSP evidence birlikte kaydedilir
Policy creation permission, sanitizer result, correct sink type ve enforcement disposition birbirinden ayrı check’lerdir. Seçili ledger atlas-rich-text policy’sine izin verir, review revision 1’i require eder ve supported enforce/no-default innerHTML profile’ında plain string’i reddeder. Ordinary h2.textContent bu HTML type gate’ine ihtiyaç duymaz; original text ile data olarak kalır. CSP’nin report-only ve enforce davranışı örneğin boolean tablosunda ayrı gösterilir, report delivered diye bir sonuç uydurulmaz. Native encoding/plain-data projector sonucu; pure model sonucu; actual sanitizer/TT/browser sonucu ayrı kanıt düzeyleridir. Yeni bir browser gözlemi için desteklenen feature, uygulanan policy ve sink sonucu birlikte kaydedilmelidir; bu defter o gözlemin yerine geçmez.
ŞİMDİ VAKAYA UYGULA
TrustedHTML etiketi transformation’ın doğru olduğunu kanıtlıyor mu?
Atlas’ın rich text policy’si p, em ve strong tag’lerine izin veriyor; class attribute’unu kaldırmayı bekliyor. InnerHTML için atlas-rich-text ve revision 1 type/policy gate’i, textContent için normal string yolu var. Bu declared sonuçlar gerçek sanitizer veya browser Trusted Types enforcement ölçümü değil.
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
Rich text policy ve typed sink ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"plainTitle": "Tea & Bread",
"richInput": "<p class=\"note\">Tea & <em>Bread</em></p>",
"declaredRichOutput": "<p>Tea & <em>Bread</em></p>",
"actualSanitizer": false,
"actualTrustedTypes": false,
"actualBrowser": false,
"actualFramework": false,
"actualScript": false,
"htmlDocument": true,
"authorParserOptions": false,
"defaultPolicy": false,
"supportDeclared": true
},
"formatPolicy": {
"allowedTags": [
"p",
"em",
"strong"
],
"allowedAttributes": [],
"inputTree": {
"tag": "p",
"attrs": {
"class": "note"
},
"children": [
{
"text": "Tea & "
},
{
"tag": "em",
"attrs": {},
"children": [
{
"text": "Bread"
}
]
}
]
},
"projectedTree": {
"tag": "p",
"attrs": {},
"children": [
{
"text": "Tea & "
},
{
"tag": "em",
"attrs": {},
"children": [
{
"text": "Bread"
}
]
}
]
},
"plainTextExpected": "Tea & Bread",
"projectorIsHTMLSanitizer": false
},
"trustedTypes": {
"policyNames": [
"atlas-rich-text"
],
"expectedSinkType": "TrustedHTML",
"sink": "innerHTML",
"enforce": true,
"reviewedRevision": 1,
"brandedInstanceCreated": false,
"rows": [
{
"case": "normal",
"sink": "innerHTML",
"typeDeclared": "TrustedHTML",
"policyName": "atlas-rich-text",
"reviewRevision": 1,
"policyCreated": true,
"expected": true
},
{
"case": "plain-text",
"sink": "h2.textContent",
"typeDeclared": "string",
"policyName": null,
"reviewRevision": null,
"policyCreated": false,
"expected": true
},
{
"case": "type-mismatch",
"sink": "innerHTML",
"typeDeclared": "string",
"policyName": null,
"reviewRevision": null,
"policyCreated": false,
"expected": false
},
{
"case": "policy-denied",
"sink": "innerHTML",
"typeDeclared": "TrustedHTML",
"policyName": "other-policy",
"reviewRevision": 1,
"policyCreated": false,
"expected": false
}
]
},
"csp": {
"sourcePolicy": "script-src 'self'",
"ttPolicy": "require-trusted-types-for 'script'; trusted-types atlas-rich-text",
"documentOrigin": "https://atlas.example.org",
"rows": [
{
"sourceOrigin": "https://atlas.example.org",
"disposition": "enforce",
"matched": true,
"blocked": false,
"diagnostic": false
},
{
"sourceOrigin": "https://static.example.net",
"disposition": "enforce",
"matched": false,
"blocked": true,
"diagnostic": true
},
{
"sourceOrigin": "https://static.example.net",
"disposition": "report",
"matched": false,
"blocked": false,
"diagnostic": true
}
],
"actualRequest": false,
"actualExecution": false,
"reportDelivered": false
},
"boundaries": {
"brandMeansSanitized": false,
"cspSanitizesHTML": false,
"autoescapingCoversRawHTML": false,
"typeMeansServerPermission": false,
"postSanitizeMutationRetainsReview": false
}
}- formatPolicy
- Fixed benign declaration’ın izinli formatting tree projection’ı; HTML sanitizer değil.
- trustedTypes.rows
- Selected enforce/no-default profile için declared type/policy gate.
- csp.rows
- Own self-source matrix; script fetch/execution veya report delivery yok.
- profile
- Actual sanitizer/TT/browser/framework evidence olmadığını ayrı belirtir.
Finite benign tree projection ve declared policy/type outcomes; actual sanitizer, branded TrustedHTML, CSP/TT enforcement, browser/parser veya framework execution değildir.
İki yanlış kanı
TrustedHTML browser tarafından otomatik sanitize edilir.
Type brand application policy’nin trust kararını taşır; callback ve final formatting policy ayrıca doğru olmalıdır.
CSP autoescaping ve sanitizer yerine geçer.
CSP execution/loading boundary ekler; output context veya allowed rich text tree’yi kendiliğinden düzeltmez.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
innerHTML için enforce edilen Trusted Types koşulu var. Input yalnız string; type-mismatch satırı ne öngörüyor?
- Kabul edilmez. Bu satırda expected=false.
- String’in public kaynaktan gelmesi type koşulunu kaldırır.
Gerekçeli cevabı oku
Kabul edilmez. Bu satırda expected=false. — Bu profile göre innerHTML TrustedHTML ister. h2.textContent’in string kabul etmesi farklı sink koşuludur.
Aynı sourceOrigin enforce ve report satırlarında neden farklı blocked değerleri taşıyor?
Dersten seçilen artifact alanları; öğretim örneği
- csp.rows[1]
- {"sourceOrigin":"https://static.example.net","disposition":"enforce","matched":false,"blocked":true,"diagnostic":true}
- csp.rows[2]
- {"sourceOrigin":"https://static.example.net","disposition":"report","matched":false,"blocked":false,"diagnostic":true}
- csp.reportDelivered
- false
- Diagnostic varsa iki satır da network’i kesin engeller.
- Enforce engeller; report yalnız diagnostic üretir.
Gerekçeli cevabı oku
Enforce engeller; report yalnız diagnostic üretir. — İki satırda matched=false. Enforce için blocked=true, report için false. Diagnostic oluşması raporun gerçekten teslim edildiği anlamına gelmez.
Rich input için class kaldırılıyor ve em korunuyor. Bu projected tree neden gerçek sanitizer kanıtı değil? TrustedHTML etiketi tek başına sanitization mı?
Gerekçeli cevabı oku
Allowlist p/em/strong ve boş attribute listesini tanımlar; projected tree bu kararı açıklar. projectorIsHTMLSanitizer=false olduğu için tam HTML sanitizer doğrulaması yapılmış sayılmaz. TrustedHTML type’ı da policy’nin sanitization kalitesini kendiliğinden kanıtlamaz. CSP HTML’i sanitize etmez; raw HTML kullanımı autoescaping sınırını aşabilir. İncelenen output sonradan değiştirilirse önceki review aynı byte’ları artık kapsamıyor olabilir.
□ Tree projection’ını gerçek sanitizer çalışması saymadım.
□ Trusted Types, CSP ve sanitization rollerini ayırdım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- React — Common components: raw HTML boundarychildren props; Dangerously setting the inner HTML; TrustedHTML policy responsibility
- OWASP — XSS Prevention controlsFramework Security; Output Encoding; HTML Sanitization · Safe Sinks; Other Controls: CSP additional layer; post-sanitization mutation
- W3C Trusted Types — Working Draft, 7 October 2026§2.3 policies and creation responsibility; §2.4.1 CSP enforcement · §3.4–3.5 compliant input/string; §4.2.1 require-trusted-types-for; §4.2.2 trusted-types
- W3C CSP Level 3 — Working Draft, 16 September 2026§3.1 enforcing header; §3.2 report-only; §6.1.10 script-src
- WHATWG DOM — textContent§4.4 ordinary-element set text content creates Text node