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?
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Offline hit
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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 & 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?
- Evet. Offline olmak bütün schema kontrollerini kaldırır.
- 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}
- Lookup inherited property bulabilir; freeze burada shallow.
- 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
- MDN — Using Service WorkersBasic architecture: initial/replacing worker; registration scope; Custom responses and response clone/waitUntil
- W3C Service Workers — cache lifetimes and path restriction§5.2 Understanding Cache Lifetimes; §6.5 Path restriction (non-normative)
- MDN — Cache interfaceDescription: explicit updates/deletion, storage eviction, Vary matching, HTTP-header independence
- MDN — Object.hasOwnDescription; Direct versus inherited properties; null-prototype objects
- MDN — Object.freezeDescription: own data/accessor properties; shallow freezing
- OWASP — Prototype Pollution PreventionSuggested protection: Map/Set, null-prototype objects, freeze/seal limits
- WHATWG HTML — named Window access§7.2.2.3 supported names and single element/collection; explicit lookup guidance
- WHATWG HTML — form named properties§4.10.3 supported property names; named control getter/past-names map
- OWASP — DOM Clobbering PreventionMitigation #1 namespace isolation; #3 local trusted configuration/shallow freeze; #5–8 explicit/local variables and type checking