Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-10.S04

Service worker cache, object trust ve DOM clobbering

Offline content, own property ve named DOM reference neden aynı trust kararı değildir?

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Offline hit

  1. Client hazır

    Controlled client public book-A title’ını ister; cache sonucu henüz seçilmedi.

    Atlas client
    Title yok; controlled v2
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  2. Local GET hazırlığı

    UI fixed read request’i hazırlar; request preparation network receipt değildir.

    Atlas client
    GET book-A ready
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  3. Local fetch event

    Worker event dispatch ve cache lookup local işlemdir; origin’e paket gitmez.

    Atlas client
    GET book-A ready
    Worker + Cache
    Cache candidate; shape pending
    Origin server
    Request yok; read yok
  4. Local admission gate

    Exact key, public classification, app expiry ve own schema bu declared entry için geçer.

    Atlas client
    GET book-A ready
    Worker + Cache
    Cache response ready; schema=2
    Origin server
    Request yok; read yok
  5. Local response dönüşü

    Stored response client’a local olarak sağlanır; body interpretation hâlâ ayrı adımdır.

    Atlas client
    Local body ready; source=cache
    Worker + Cache
    Cache response ready; schema=2
    Origin server
    Request yok; read yok
  6. Literal title sonucu

    Tea & Bread plain title olarak beklenir; offline hit güncel server permission kanıtı değildir.

    Atlas client
    Literal Tea & Bread; offline
    Worker + Cache
    Cache response ready; schema=2
    Origin server
    Request yok; read yok

Network fallback

  1. Client hazır

    Selected client controlled worker kullanır; network branch’ında stored entry yoktur.

    Atlas client
    Title yok; controlled v2
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  2. Read hazır

    Public book-A için fixed GET hazırlanır; browser henüz response almamıştır.

    Atlas client
    GET book-A ready
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  3. Local cache miss

    Worker cache miss’i local olarak değerlendirir; Atlas origin’e public GET hazırlar.

    Atlas client
    GET book-A ready
    Worker + Cache
    Cache miss; network GET ready
    Origin server
    Request yok; read yok
  4. Origin request aldı

    Prepared GET origin’e varmıştır; server’ın public read gate’i henüz sonuçlanmamıştır.

    Atlas client
    GET book-A ready
    Worker + Cache
    Cache miss; network GET ready
    Origin server
    GET arrived; public gate pending
  5. Local read response

    Server declared public book JSON’u hazırlarken hiçbir private session body’si kullanılmaz.

    Atlas client
    GET book-A ready
    Worker + Cache
    Cache miss; network GET ready
    Origin server
    Public JSON response ready
  6. Response worker’da

    HTTP response worker’a varmıştır; application shape ve cache admission ayrı local karardır.

    Atlas client
    GET book-A ready
    Worker + Cache
    Network body arrived; gate pending
    Origin server
    Public JSON response ready
  7. Local schema/version

    Örnekteki body, gerekli own-field schema’sını karşılar. Bu sahne storage write işlemini çalıştırmış sayılmaz.

    Atlas client
    GET book-A ready
    Worker + Cache
    Public title response ready; v2
    Origin server
    Public JSON response ready
  8. Local client outcome

    Worker’ın response’u local client’a döner; title, plain text olarak kullanılacak veridir.

    Atlas client
    Literal Tea & Bread; network
    Worker + Cache
    Public title response ready; v2
    Origin server
    Public JSON response ready

Shape reddi

  1. Offline başlangıç

    Client offline ve stored candidate mevcut; server henüz hiç request almamıştır.

    Atlas client
    Title yok; controlled v2
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  2. Local read intent

    Fixed title read hazırlanır; server connection açıldığına dair sonuç üretilmez.

    Atlas client
    GET book-A ready
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  3. Local candidate check

    Declared candidate expected own field’i karşılamaz; inherited label kabul için yeterli değildir.

    Atlas client
    GET book-A ready
    Worker + Cache
    Own shape denied; offline
    Origin server
    Request yok; read yok
  4. Local fallback

    Offline policy original candidate yerine plain unavailable result hazırlamayı seçer.

    Atlas client
    GET book-A ready
    Worker + Cache
    Offline fallback ready
    Origin server
    Request yok; read yok
  5. Client fallback sonucu

    Client local unavailable sonucu görür; bu server authz denial veya yeni response değildir.

    Atlas client
    Title unavailable; no origin read
    Worker + Cache
    Offline fallback ready
    Origin server
    Request yok; read yok

Named element

  1. Fixed DOM defteri

    Benign atlasBookForm/bookTitle declaration local namespace ve value tiplerini ayırır.

    Atlas client
    Title yok; controlled v2
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  2. Named reference

    Expected Window/form lookup element reference verir; title string’i doğrudan üretilmez.

    Atlas client
    Form/control references; not text
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  3. Local type gate

    Application retained local config’i kullanır; reference’ın string diye coercion edilmesi seçilmez.

    Atlas client
    Local config own title validated
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  4. Local explicit value

    Expected control .value ve own config title farklı owners’tan plain data olarak alınır.

    Atlas client
    Plain title Tea & Bread ready
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok
  5. Expected text sonucu

    Sonuç plain text olarak gösterilir; gerçek named DOM getter veya clobbering işlemi çalıştırılmaz.

    Atlas client
    Literal Tea & Bread; local only
    Worker + Cache
    atlas-v2; public entry
    Origin server
    Request yok; read yok

ROLLER · STATE · VERİ AKIŞI

Service Worker, cache ve client ayrı state taşır

Atlas’ın public book title’ı Tea & Bread offline okunabilsin. Worker DOM’a erişen page script değildir; controlled client’ın fetch event’ine kendi worker context’inde katılır ve response seçebilir. Secure-context/same-origin registration ve script directory’sine bağlı maximum scope kontrolü vardır; Service-Worker-Allowed bu path sınırını değiştirebilir. Path, farklı kullanıcıları güvenli biçimde ayıran origin boundary yerine geçmez. Registration success, installed/waiting/active state ve bir document’ın controlled olması aynı gözlem değildir. İlk aktivasyondan önce açık sayfa default olarak reload gerektirebilir; clients.claim ve skipWaiting kullanımı ayrıca lifecycle seçimidir.

Cache hit bir freshness veya permission kararı değildir

Cache API, Request/Response çiftlerini application’ın yönettiği named cache’lerde tutar. HTTP cache’ten farklıdır: Cache-Control freshness veya no-store bu store’un lifecycle’ını tek başına yönetmez. Application cache admission, version, update, deletion ve fallback policy’sini seçmelidir; browser quota veya eviction nedeniyle içerik kaybolabilir. Atlas-v2 yalnız public JSON book-A’yı exact URL ve schemaVersion=2 ile kabul eder. Bu application kontrolü, Cache.match algoritmasının yerine geçmez; Vary ve matching options ayrıca önemlidir. Body’nin parse edilebilmesi, güncel server permission veya revocation sonucu değildir. Private ya da session-bound data bu public offline policy’ye karışırsa account switch ve logout sonrasında disclosure riski doğar.

Own property ile named DOM lookup aynı mekanizma değildir

JSON book object için own id/title/schemaVersion ve expected types açıkça kontrol edilir. Prototype chain’den gelen bir displayMode property’sinin okunabilmesi onun input’un kendi field’ı olduğunu göstermez; Object.hasOwn bu iki durumu ayırır. Prototype pollution, shared/inherited object state’in unsafe write veya merge ile değişip başka consumer’a ulaşması sınırıdır; yalnız JSON parse etmek böyle bir değişiklik yaptı diye sunulmaz. DOM clobbering ise HTML id/name’in legacy Window/form named access ile application lookup’una karışmasıdır, prototype mutation değildir. Fixed atlasBookForm ve bookTitle control’u named lookup’ta element verir, title string’i değil. Local module configuration, explicit element lookup ve expected element/value type kontrolü bu namespace’leri ayırır; Object.freeze trusted own object’te shallow’dur ve window/document için genel çözüm değildir.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Offline authority

  1. Public cache entry

    CacheName atlas-v2, public visibility ve schemaVersion 2 entry’si now 100 için seçiliyor. Online false olsa da normal row expected cache; server bu görüntüleme için yeni request almıyor.

    Cache ve object ledger
    Public cache / now100 < expires120
    Eligibility ve ownership
    Henüz değerlendirilmedi
    Consumer sonucu
    Henüz değerlendirilmedi
  2. HTTP header ayrımı

    Entry Cache-Control no-store taşıyor, fakat bu Cache API örneği appExpiresAt ile eligibility değerlendiriyor. HTTP cache freshness veya otomatik header enforcement bu modelin kuralı değil.

    Cache ve object ledger
    Public cache / now100 < expires120
    Eligibility ve ownership
    Application expiration ≠ HTTP cache policy
    Consumer sonucu
    Henüz değerlendirilmedi
  3. Authz’yi yenileme sayma

    Cache body verilmesi current server authorization değildir. Public title’ın eski olması otomatik compromise da değil; private admission varsa user/context lifecycle ayrıca tasarlanmalı.

    Cache ve object ledger
    Public cache / now100 < expires120
    Eligibility ve ownership
    Application expiration ≠ HTTP cache policy
    Consumer sonucu
    Offline body ≠ fresh server grant
  4. Shape deny branch’i

    Shape-denied entryPresent true olsa da ownShape false ve offline-fallback seçer. Local reject, server permission check sonucu diye yazılamaz; network burada yok.

    Cache ve object ledger
    Entry present / shape false / fallback
    Eligibility ve ownership
    Application expiration ≠ HTTP cache policy
    Consumer sonucu
    Offline body ≠ fresh server grant
  5. Controller varsayımını koru

    controlledDeclared true ve workerVersion 2 başlangıç varsayımıdır. Registration scope /books/ path’i hard security boundary değil; old client’ın otomatik v2’ye geçtiği kanıtı da değil.

    Cache ve object ledger
    Entry present / shape false / fallback
    Eligibility ve ownership
    Declared controller v2 / lifecycle separate
    Consumer sonucu
    Offline body ≠ fresh server grant
  6. Seçimi sınırlı bildir

    Cache, network veya fallback kararı app eligibility’ye bağlı tutuluyor. Gerçek Service Worker, Cache API write veya durable storage çalıştığı iddiası bu data ledger’dan çıkarılmıyor.

    Cache ve object ledger
    Entry present / shape false / fallback
    Eligibility ve ownership
    Declared controller v2 / lifecycle separate
    Consumer sonucu
    Finite cache selection / runtime unmeasured

Property identity

  1. Inherited option

    InheritedFixture displayMode cards okur, fakat hasOwnDisplayMode false. Readable property’nin own data sözleşmesinde bulunduğunu varsaymak farklı ownership yollarını birleştirir.

    Cache ve object ledger
    Read cards / hasOwn false
    Eligibility ve ownership
    Henüz değerlendirilmedi
    Consumer sonucu
    Henüz değerlendirilmedi
  2. Closed own schema

    Book consumer id, title ve schemaVersion own alanlarını ve türlerini değerlendirir. Presence ile value/type ayrı; Object.hasOwn bir alanın business izni olduğunu söylemez.

    Cache ve object ledger
    Read cards / hasOwn false
    Eligibility ve ownership
    Own fields + value/type / no grant
    Consumer sonucu
    Henüz değerlendirilmedi
  3. Shallow freeze etkisi

    OuterFrozen true, nestedFrozen false; nestedRevisionAfterUpdate 3. Dış object’in freeze edilmesi nested verinin değişmezliği veya güncel review kapsamı değildir.

    Cache ve object ledger
    Read cards / hasOwn false
    Eligibility ve ownership
    Own fields + value/type / no grant
    Consumer sonucu
    Outer frozen / nested revision3
  4. DOM named reference

    atlasBookForm lookup için HTMLFormElement, bookTitle için HTMLInputElement bekleniyor. Element reference ile control value Tea & Bread ayrı tipler; window adı local config değildir.

    Cache ve object ledger
    Form reference / control reference / value string
    Eligibility ve ownership
    Own fields + value/type / no grant
    Consumer sonucu
    Outer frozen / nested revision3
  5. İki mekanizmayı ayır

    DOM named lookup prototype mutation değildir. JSONParseMutatesPrototype false; inherited lookup ile HTML namespace lookup farklı kaynak ve consumer koşulları taşır.

    Cache ve object ledger
    Form reference / control reference / value string
    Eligibility ve ownership
    Prototype lookup ≠ DOM named lookup
    Consumer sonucu
    Outer frozen / nested revision3
  6. Explicit reference kullan

    Consumer kendi localConfig reference’ından title okur; global named property’yi truthy diye trusted string saymaz. Normal form veya inherited option burada executable saldırı sonucu olarak sunulmuyor.

    Cache ve object ledger
    Form reference / control reference / value string
    Eligibility ve ownership
    Prototype lookup ≠ DOM named lookup
    Consumer sonucu
    Explicit config / typed own data

VARSAYIM · SINIR · KONTROL

Persisted response’u güncel authority sanmak

Normal cache hit network’e gitmeden body verebilir; bunun prerequisite’i selected worker/client ve eligible stored entry’dir. Bozulan varsayım server’ın bu görüntüleme sırasında yeniden authz veya freshness değerlendirdiğidir. Etki content revision’ın eski kalması veya yanlış cache admission kullanılmışsa private body’nin yanlış user context’inde görünmesidir; her stale public title security compromise değildir. Worker v2 geldi diye old cache entry’nin silindiği veya old client’ın v2 ile çalıştığı varsayılmaz. Kontrol public/private endpoint sınıflandırmasını, content version’ı, cache key/context’i ve account lifecycle’ını explicit tutmaktır. Artifact offline/shape-denied branch’ında local fallback seçer; server hiç request görmediği için denial server permission check diye etiketlenmez.

Readable property expected data olmayabilir

Trust error object.title veya window-level name’i yalnız truthy diye kabul etmek olabilir. Prototype path ve DOM named property farklı prerequisite’lere sahiptir: ilki unsafe object state propagation, ikincisi relevant HTML namespace ve o namespace’i consumer’ın kullanmasıdır. Etki field/type confusion’dan kullanılan sink’e göre değişir; her named form veya inherited benign option exploit değildir. Fixed book form normal ve harmless’tır; ders yalnız reference ile title string arasındaki tip sınırını gösterir. Kontrol closed own-field schema, explicit local configuration ve markup namespace policy’dir. Freeze nested object’i immutable yapmaz; sanitizer’ın XSS için seçilmiş olması bütün named-property risklerini kaldırdığı anlamına gelmez. Bu yüzden output interpretation ile object ownership iki ayrı review sorusudur.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Seçim kontrolleri

  1. Dört sonucu oku

    Rows tablosu normal/named-dom için cache, online missing entry için network, shape-denied için fallback öngörür. Scene’in named-dom dalı ise cache fetch yapmaz; yalnız fixed form/control reference’ını inceler. Matrix beklentisi ile çalıştırılan mekanizmayı ayrı tut.

    Selection ledger
    Cache/cache / network / fallback
    Kaynak ve tip review’ü
    Henüz değerlendirilmedi
    Regression sonucu
    Henüz değerlendirilmedi
  2. Cache eligibility kaydı

    Request URL, atlas-v2, public classification, schemaVersion 2 ve app expiration birlikte korunur. Origin log’unda request yokluğu cache body görülmediğini söylemez.

    Selection ledger
    Cache/cache / network / fallback
    Kaynak ve tip review’ü
    URL/version/public/schema/expiration
    Regression sonucu
    Henüz değerlendirilmedi
  3. Own object kontrolü

    OwnObject id book-A, title Tea & Bread ve schemaVersion 2 taşır. Inherited option için hasOwn false, nested object için shallow freeze farkı ayrı olumlu/olumsuz kontrollerdir.

    Selection ledger
    Cache/cache / network / fallback
    Kaynak ve tip review’ü
    URL/version/public/schema/expiration
    Regression sonucu
    Own fields / inherited false / shallow freeze
  4. Named DOM beklentisi

    NamedDOM executed false; form/control interface’leri yalnız beklenen sonuçlar. Native object property testini gerçek DOM named lookup diye sunmadan bu fark kaydedilir.

    Selection ledger
    Expected interfaces / DOM unexecuted
    Kaynak ve tip review’ü
    URL/version/public/schema/expiration
    Regression sonucu
    Own fields / inherited false / shallow freeze
  5. Eksik field ile tipi ayır

    Object.hasOwn null value için de true olabilir; accepted schema ayrıca title string ve revision türünü kontrol eder. Normal own object başarısı başka inherited input için varsayılmaz.

    Selection ledger
    Expected interfaces / DOM unexecuted
    Kaynak ve tip review’ü
    Presence ≠ valid value/type
    Regression sonucu
    Own fields / inherited false / shallow freeze
  6. Dar regression kanıtı

    Finite selection ve object ownership sonuçları ayrı doğrulanır. Cache API, HTML parser ve Service Worker lifecycle çalışmadığı için bu kontroller offline browser başarısı veya güncel authz kanıtı değildir.

    Selection ledger
    Expected interfaces / DOM unexecuted
    Kaynak ve tip review’ü
    Presence ≠ valid value/type
    Regression sonucu
    Finite object/cache predicates / browser separate

Controller boşluğu

  1. Origin log’u boş

    Bu artifact cache seçim fonksiyonunun verilen row koşullarını ve object/lookup defterini taşır. Network dalında origin receipt model içinde gösterilir; normal ve shape-denied dalları origin’e gitmez. named-dom ise aynı cache row’unu yeniden çalıştıran bir read değildir: yalnız element reference ile value string ayrımını inceler. Controller/version ve expected lookup bilgileri gerçek Browser ölçümü değildir. İnceleyenin elinde origin request kaydı yok, fakat client title görüyor. Normal cache flow origin’e gitmeden body verebilir; boş log hiçbir content görülmedi sonucuna yetmez.

    Selection ledger
    Title known / origin receipt absent
    Kaynak ve tip review’ü
    Henüz değerlendirilmedi
    Regression sonucu
    Henüz değerlendirilmedi
  2. Controller identity eksik

    Current controller, worker version ve response source kaydı yok. Profile’daki v2 başlangıcı bu eksik olayın controller kanıtı olarak kopyalanamaz; registration ile control ayrı aşama.

    Selection ledger
    Title known / origin receipt absent
    Kaynak ve tip review’ü
    Current controller/version/source missing
    Regression sonucu
    Henüz değerlendirilmedi
  3. Kaynağı açık bırak

    Bu gözlem için cache/network/fallback seçimi UNKNOWN. Tea & Bread görünümü own-field schema veya private lifecycle başarısını tek başına kanıtlamıyor.

    Selection ledger
    Title known / origin receipt absent
    Kaynak ve tip review’ü
    Current controller/version/source missing
    Regression sonucu
    Response source/eligibility UNKNOWN
  4. Gerekli kaynak bilgisi

    Client controller, version, request key, cache name ve response source aynı display’e bağlanmalı. Fallback reason ve app expiration, server receipt’inden farklı gözlem noktalarıdır.

    Selection ledger
    Needed: controller/version/key/source/reason
    Kaynak ve tip review’ü
    Current controller/version/source missing
    Regression sonucu
    Response source/eligibility UNKNOWN
  5. Yerel lookup sınırı

    Named form reference bulundu diye local configuration’ın değiştiği söylenmez. Config reference ve consumer type kaydı gerekli; property lookup sonucuyla server authorization birleştirilmez.

    Selection ledger
    Needed: controller/version/key/source/reason
    Kaynak ve tip review’ü
    Config reference/type separate from authz
    Regression sonucu
    Response source/eligibility UNKNOWN
  6. Yeni inceleme amacı

    Yeni kayıt content source ile object ownership’i ayrı yanıtlamalı. Bu olayda title gözlemi korunur, fakat controller, cache eligibility veya DOM lookup başarısı için ek iddia üretilmez.

    Selection ledger
    Needed: controller/version/key/source/reason
    Kaynak ve tip review’ü
    Config reference/type separate from authz
    Regression sonucu
    Retain title / collect scoped source evidence

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Cache decision için doğru observation point

Bu artifact cache seçim fonksiyonunun verilen row koşullarını ve object/lookup defterini taşır. Network dalında origin receipt model içinde gösterilir; normal ve shape-denied dalları origin’e gitmez. named-dom ise aynı cache row’unu yeniden çalıştıran bir read değildir: yalnız element reference ile value string ayrımını inceler. Controller/version ve expected lookup bilgileri gerçek Browser ölçümü değildir. Client controller identity, worker/cache version, request URL, response source ve offline fallback reason birlikte gözlemlenir. Origin access log’unda request olmaması client hiç content görmedi demek değildir; cache hit origin’e ulaşmaz. Cache admission kaydı selected public classification/schema revision’ını taşır, secret veya private body loglanmaz. Response clone ve event.waitUntil storage work’ünü destekler; clone başarıyla oluşturuldu diye eventual cache write başarılı veya durable sayılmaz. Update regression old controlled client, waiting worker, cache eviction/miss ve app-version mismatch’i ayrı test eder. Browser storage temizliği yalnız bir cache adı silindi diye tamamlanmış varsayılmaz; logout/account switch için private offline state varsa onun lifecycle’ı da açık tasarlanır.

Field ownership ve DOM namespace’ini sınırla

Book consumer accepted keys/types listesiyle own fields’i doğrular; Map veya null-prototype dictionary dynamic data alanları için inherited lookup’u azaltabilir, fakat business authorization sağlamaz. Object.hasOwn null veya undefined value için true dönebildiğinden presence kontrolünü value/type kontrolünden ayır. Trusted config yalnız local reference’tan okunur, global named DOM value’dan oluşturulmaz. Fixed form/control lookup beklenen interface ve .value string’ini ayrı taşır; duplicate name varsa collection/past-name davranışını tek string’e eşitleme. Regression normal own object, missing own field, inherited benign option ve named element reference için farklı sonuç ister. Pure fixture/Node property sonucu gerçek DOM named lookup veya Service Worker Cache API execution yerine geçirilmez.

ŞİMDİ VAKAYA UYGULA

Cache hit güncel server izni veya güvenilir object anlamına gelir mi?

Atlas v2 public cache, now 100 için appExpiresAt 120 olan book-A verisini seçiyor. Body’nin own-field şekli uyuşmazsa offline fallback var. Normal form adına erişim bir HTMLFormElement beklentisi, inherited displayMode ise object lookup sonucu; ikisi title string veya server yetkisiyle aynı şey 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

Offline cache ve object ownership defteri

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "origin": "https://atlas.example.org",
    "script": "/books/sw.js",
    "scope": "/books/",
    "controlledDeclared": true,
    "workerVersion": 2,
    "cacheName": "atlas-v2",
    "publicOnly": true,
    "actualSW": false,
    "actualCache": false,
    "actualDOM": false,
    "actualNetwork": false
  },
  "request": {
    "method": "GET",
    "url": "https://atlas.example.org/books/book-A.json"
  },
  "entry": {
    "url": "https://atlas.example.org/books/book-A.json",
    "cacheName": "atlas-v2",
    "visibility": "public",
    "body": {
      "id": "book-A",
      "title": "Tea & Bread",
      "schemaVersion": 2
    },
    "httpHeaders": {
      "Cache-Control": "no-store"
    },
    "appExpiresAt": 120
  },
  "rows": [
    {
      "case": "normal",
      "now": 100,
      "online": false,
      "entryPresent": true,
      "ownShape": true,
      "expected": "cache"
    },
    {
      "case": "network",
      "now": 100,
      "online": true,
      "entryPresent": false,
      "ownShape": true,
      "expected": "network"
    },
    {
      "case": "shape-denied",
      "now": 100,
      "online": false,
      "entryPresent": true,
      "ownShape": false,
      "expected": "offline-fallback"
    },
    {
      "case": "named-dom",
      "now": 100,
      "online": false,
      "entryPresent": true,
      "ownShape": true,
      "expected": "cache"
    }
  ],
  "objectLedger": {
    "expectedOwnFields": [
      "id",
      "title",
      "schemaVersion"
    ],
    "ownObject": {
      "id": "book-A",
      "title": "Tea & Bread",
      "schemaVersion": 2
    },
    "inheritedFixture": {
      "prototype": {
        "displayMode": "cards"
      },
      "own": {
        "title": "Tea & Bread"
      },
      "readDisplayMode": "cards",
      "hasOwnDisplayMode": false
    },
    "shallowFreeze": {
      "outerFrozen": true,
      "nestedFrozen": false,
      "nestedRevisionAfterUpdate": 3
    },
    "jsonParseMutatesPrototype": false
  },
  "namedDOM": {
    "declaration": "<form name=\"atlasBookForm\"><input name=\"bookTitle\" value=\"Tea &amp; Bread\"></form>",
    "windowLookupExpected": "HTMLFormElement",
    "formLookupExpected": "HTMLInputElement",
    "controlValueExpected": "Tea & Bread",
    "localConfig": {
      "title": "Tea & Bread"
    },
    "lookupGrantsTrust": false,
    "executed": false
  },
  "boundaries": {
    "cacheUsesHTTPFreshnessAutomatically": false,
    "pathIsHardSecurityBoundary": false,
    "offlineResultIsFreshAuthorization": false,
    "freezeIsDeep": false,
    "DOMNamedLookupIsPrototypeMutation": false
  }
}
profile
Selected controlled worker ve public-only declaration.
entry
Request key, app expiration ve HTTP header farklı alanlardır.
rows
Cache, network veya local fallback seçimi.
objectLedger
Own/inherited field ve shallow freeze beklentileri.
namedDOM
Fixed benign form/control lookup tipleri; browser execution değildir.

Sentetik public response ve önceden tanımlı object/DOM defteri; Cache API veya HTML parser çalıştırılmaz.

İki yanlış kanı

Cache-Control no-store bütün offline storage’ı yönetir.

Cache API ayrı author-managed storage’dır; admission ve deletion app policy ister.

DOM clobbering prototype pollution ile aynı değişikliktir.

Named DOM references ve prototype-chain state farklı namespace/mekanizmalardır.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Offline entry mevcut, fakat ownShape=false. Cache policy’si bu body’yi kabul eder mi?

  1. Evet. Offline olmak bütün schema kontrollerini kaldırır.
  2. Hayır. Sonuç offline-fallback.
Gerekçeli cevabı oku

Hayır. Sonuç offline-fallback. — shape-denied satırı entryPresent=true olsa da object koşulu geçmediği için cached body’yi kullanmaz.

displayMode okunabiliyor, fakat hasOwnDisplayMode=false. Outer object frozen iken nested revision neden değişebiliyor?

Dersten seçilen artifact alanları; öğretim örneği

objectLedger.inheritedFixture
{"prototype":{"displayMode":"cards"},"own":{"title":"Tea & Bread"},"readDisplayMode":"cards","hasOwnDisplayMode":false}
objectLedger.shallowFreeze
{"outerFrozen":true,"nestedFrozen":false,"nestedRevisionAfterUpdate":3}
  1. Lookup inherited property bulabilir; freeze burada shallow.
  2. Okunan her property own’dur; outer freeze bütün nested veriyi dondurur.
Gerekçeli cevabı oku

Lookup inherited property bulabilir; freeze burada shallow. — displayMode prototype’tan gelir. outerFrozen=true, nestedFrozen=false olduğu için nestedRevisionAfterUpdate=3 olabilir.

Cache entry’de Cache-Control: no-store var. Explicit Cache API ve appExpiresAt neden ayrı policy ister? Named DOM lookup neyi güvenilir yapmaz?

Gerekçeli cevabı oku

Cache API, HTTP freshness kurallarını otomatik uygulamaz; application version, expiry ve public eligibility koşullarını kendisi denetler. Offline cached body güncel server authorization değildir. Bir form veya control adına göre lookup, HTMLFormElement/HTMLInputElement döndürebilir; bu sonuç local config’in güvenilirliği değildir. Named DOM lookup ile prototype mutation ayrı mekanizmalardır. Bu artifact gerçek service worker, cache veya DOM işlemi çalıştırmaz.

□ Cache API policy’sini HTTP cache kurallarıyla eşitlemedim.

□ Named DOM sonucunu config veya object trust kanıtı saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam