Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-10.S03

Escaping, sanitization, CSP ve Trusted Types

Text escaping, formatting policy ve typed sink enforcement neden farklı kontrol katmanlarıdır?

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Vetted rich text

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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

  1. 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
  2. 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
  3. 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
  4. 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

  1. 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
  2. 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
  3. 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
  4. 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

  1. 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
  2. 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
  3. 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
  4. 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ı

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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 &amp; <em>Bread</em></p>",
    "declaredRichOutput": "<p>Tea &amp; <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?

  1. Kabul edilmez. Bu satırda expected=false.
  2. 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
  1. Diagnostic varsa iki satır da network’i kesin engeller.
  2. 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