Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-11.03

iframe isolation ve postMessage

Atlas, cross-origin readonly preview widget’iyle dar bir message contract kullanır. Window reference, delivery ve application acceptance farklı adımlardır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Doğru reply

  1. Document’ler hazır

    Atlas parent ve preview-one listener’ları hazırdır; parent tx-current için reply bekler. Cross-origin document’ler doğrudan DOM paylaşmaz. Henüz get-title message hazırlanmış veya teslim edilmiş değildir.

    Atlas · parent
    Listeners ready; tx-current pending
    Preview · iframe
    Listeners ready; readonly title
  2. Readonly request hazır

    Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Listeners ready; readonly title
  3. Preview event aldı

    Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request event received; gates pending
  4. Preview kabul gate’i

    Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request accepted; readonly title selected
  5. Reply task hazır

    Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Reply queued; tx-current/preview-one
  6. Parent event aldı

    Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.

    Atlas · parent
    Reply event received; acceptance pending
    Preview · iframe
    Reply queued; tx-current/preview-one
  7. Parent kabul gate’i

    Parent selected reply koşullarını birlikte kontrol etti; normal reply kabul edildi.

    Atlas · parent
    Reply accepted; no display update yet
    Preview · iframe
    Reply queued; tx-current/preview-one
  8. Display binding

    Selected text-only display Atlas Notları alias’ına bağlandı; model gerçek DOM, message API veya HTTP çalıştırmaz.

    Atlas · parent
    Declared text binding: Atlas Notları
    Preview · iframe
    Reply queued; tx-current/preview-one

Eski transaction

  1. Document’ler hazır

    Atlas parent tx-current için reply bekler ve preview-one listener’ı hazırdır. Bu dal daha sonra tx-old reply’sini seçer; doğru origin teslimi, eski transaction’ın kabul edileceğini baştan göstermez.

    Atlas · parent
    Listeners ready; tx-current pending
    Preview · iframe
    Listeners ready; readonly title
  2. Readonly request hazır

    Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Listeners ready; readonly title
  3. Preview event aldı

    Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request event received; gates pending
  4. Preview kabul gate’i

    Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request accepted; readonly title selected
  5. Reply task hazır

    Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Reply queued; tx-old
  6. Parent event aldı

    Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.

    Atlas · parent
    Reply event received; acceptance pending
    Preview · iframe
    Reply queued; tx-old
  7. Parent kabul gate’i

    Parent selected reply koşullarını birlikte kontrol etti; reply context uyuşmadığı için reddedildi.

    Atlas · parent
    Reply denied; display unchanged
    Preview · iframe
    Reply queued; tx-old
  8. Display binding

    Parent reply event’ini aldı, fakat tx-old beklenen tx-current ile eşleşmedi. Display binding yapılmadı. Message receipt transaction kabulü değildir; burada gerçek DOM veya HTTP çalışmaz.

    Atlas · parent
    No display binding; rejected reply
    Preview · iframe
    Reply queued; tx-old

Başka instance

  1. Document’ler hazır

    Atlas’ın iki preview’u aynı origin’dedir. Request preview-two’ya gider ama pending context preview-one bekler.

    Atlas · parent
    Beklenen preview-one; tx-current
    Preview · iframe
    Current preview-two; aynı origin
  2. Readonly request hazır

    Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Current preview-two; aynı origin
  3. Preview event aldı

    Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request event received; gates pending
  4. Preview kabul gate’i

    Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Request accepted; readonly title selected
  5. Reply task hazır

    Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.

    Atlas · parent
    get-title queued; no delivery proof
    Preview · iframe
    Reply queued; preview-two
  6. Parent event aldı

    Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.

    Atlas · parent
    Reply event received; acceptance pending
    Preview · iframe
    Reply queued; preview-two
  7. Parent kabul gate’i

    Parent selected reply koşullarını birlikte kontrol etti; reply context uyuşmadığı için reddedildi.

    Atlas · parent
    Reply denied; display unchanged
    Preview · iframe
    Reply queued; preview-two
  8. Display binding

    Reply’nin origin’i ve tx-current doğru olsa da source preview-two, beklenen preview-one değildir. Parent kabulü reddeder ve display binding yapılmaz; aynı origin aynı Window instance’ı demek değildir.

    Atlas · parent
    No display binding; rejected reply
    Preview · iframe
    Reply queued; preview-two

Frame değişti

  1. Yeni receiver context

    Preview’ın mevcut document origin’i preview-v2.example.org’dur; Atlas parent eski exact target preview.example.org’u kullanır. Browser-local task bu iki origin’i daha sonra karşılaştırır; sender henüz teslim veya ret bilgisi almış değildir.

    Atlas · parent
    Exact target preview.example.org
    Preview · iframe
    Current document preview-v2.example.org
  2. Request queue

    Parent normal readonly request’i exact eski target ile queue eder; çağrı dönüşü delivery acknowledgment değildir.

    Atlas · parent
    Request queued; no acknowledgment
    Preview · iframe
    Current document preview-v2.example.org
  3. Local target gate

    Browser-local task gate current receiver document origin’i exact target ile karşılaştırır; uyuşmadığı için event oluşturmaz.

    Atlas · parent
    Request queued; no acknowledgment
    Preview · iframe
    Target mismatch; zero message events
  4. Reply yok

    Örnekte message event sayısı sıfırdır. Sender’ın bu kararı gerçek postMessage API’sinden öğrendiği varsayılmaz.

    Atlas · parent
    No reply observed; no display update
    Preview · iframe
    Target mismatch; zero message events

ROLLER · STATE · VERİ AKIŞI

iframe görmek document’ini okumak değildir

Atlas parent’ı, preview.example.org document’ini iframe içinde gösterir. Normal cross-origin durumda parent contentWindow üzerinden bir WindowProxy reference elde edebilir; bu reference preview DOM’una genel erişim vermez. postMessage gibi sınırlı yüzeyler kullanılabilirken direct document okuması origin gate’ine bağlıdır. Aynı-origin iframe daha fazla script erişimi paylaşır; iframe etiketi tek başına her içeriği güçlü izolasyona sokmaz. Browser process seçimi de bu DOM boundary’nin görsel kutusuyla eş anlamlı değildir.

Sandbox ayrı capability sınırları ekler. Sandboxed origin flag açıkken HTTP URL aynı olsa bile document opaque origin taşır; script flag’i script çalışmasını ayrıca etkiler. allow-same-origin başka origin’i parent ile aynı yapmaz, origin sandbox restriction’ını kaldırıp document’in olağan origin bağlamını korur. Bu ders normal tuple-origin preview messaging’i seçer; opaque sandbox’a confidential message göndermek için wildcard’ı öneren bir çözüm sunmaz. Sandbox ve framing policy’nin gerçek uygulanması ayrı browser testidir.

Mesaj sözleşmesi transport değildir

Parent yalnız get-title v1 request’i gönderir: transactionAlias=tx-current ve bookAlias=atlas-notlari. postMessage data’yı structured serialization ile diğer context’e taşır ve task queue üzerinden message event oluşturur; HTTP packet veya doğrudan DOM paylaşımı değildir. Seçili exact targetOrigin=https://preview.example.org, task çalışırken receiver document origin’iyle eşleşmelidir. WindowProxy navigation sonrası başka document’i temsil edebilir. Gönderme çağrısının dönmesi, message event’in oluştuğu veya receiver’ın request’i kabul ettiği anlamına gelmez.

Preview, event.origin’ın beklenen parent origin’le, event.source’un beklenen parent WindowProxy’yle, data’nın readonly schema’yla ve transaction’ın pending context’le eşleştiğini kontrol eder. Reply title-result biçimindedir. Parent bu response’u alırken preview origin’ini ve WindowProxy’sini, ardından shape ve current transaction’ı denetler. event.origin, sender’ın çağrı anındaki origin’idir; receiver origin’i veya source window’un sonraki navigation sonucu değildir. Reply hedefi, önce doğrulanmış context’ten seçilmelidir.

Structured clone data’nın business anlamını doğrulamaz. Bu fixture MessagePort veya transferable nesne taşımaz; ports=[] açıkça seçilir. MessageChannel daha sonra kurulursa port possession ve lifecycle için ayrı capability sözleşmesi gerekir; window message’ın origin/source kontrolleri her port event’ine aynen kopyalanmaz. Birden fazla request ve asynchronous iş reply sırasını değiştirebilir; transaction binding “ilk reply benimdir” varsayımını önler. Tam task scheduler veya port transferi bu modelde çalıştırılmaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Eski reply

  1. Bekleyen işi tanı

    Parent tx-current ve preview-one için title-result bekliyor. Event kaydının origin’i doğru olsa bile hangi işin ve hangi pencerenin sonucunu taşıdığını ayrıca belirlemeliyiz.

    Preview reply kaydı
    tx-current / preview-one
    Parent kabul kuralı
    Henüz değerlendirilmedi
    Başlık bağlama sonucu
    Henüz değerlendirilmedi
  2. Eski transaction

    Stale-reply kaydı tx-old ve Earlier Atlas title taşıyor. Origin ile source doğru kalırken transaction uyuşmuyor; title-result olması tek başına kabul için yeterli değil.

    Preview reply kaydı
    tx-current / preview-one
    Parent kabul kuralı
    tx-old ≠ tx-current / reject
    Başlık bağlama sonucu
    Henüz değerlendirilmedi
  3. Başlığı koru

    Parent eski reply’yi kabul etmiyor. Event’in bulunması bir application acknowledgment değildir; eski kitap başlığı current request’in display binding’ine alınmıyor.

    Preview reply kaydı
    tx-current / preview-one
    Parent kabul kuralı
    tx-old ≠ tx-current / reject
    Başlık bağlama sonucu
    Current title unchanged
  4. İkinci pencere

    Instance-mismatch aynı preview origin’inden geliyor, fakat sourceWindow preview-two. Pending iş preview-one’a bağlı; origin eşitliği iki WindowProxy’yi tek pencereye dönüştürmüyor.

    Preview reply kaydı
    Same origin / preview-two
    Parent kabul kuralı
    tx-old ≠ tx-current / reject
    Başlık bağlama sonucu
    Current title unchanged
  5. Birlikte doğrula

    Origin, source, type, v, transactionAlias, bookAlias ve title türü birlikte doğrulanıyor. Bu readonly sözleşme text sonucu seçiyor; API kullanıcı yetkisi veya DOM render başarısı vermiyor.

    Preview reply kaydı
    Same origin / preview-two
    Parent kabul kuralı
    Origin + source + shape + transaction
    Başlık bağlama sonucu
    Current title unchanged
  6. Yanlış bağlamayı durdur

    Yanlış instance ile eski transaction ayrı reddetme nedenleri. İkisinde de current başlık korunuyor; kabul edilen normal reply yalnız kendisine bağlı readonly işin sonucunu güncelleyebilir.

    Preview reply kaydı
    Same origin / preview-two
    Parent kabul kuralı
    Origin + source + shape + transaction
    Başlık bağlama sonucu
    Rejected replies / no title update

Delivery sınırı

  1. Exact hedefi kaydet

    Request için targetOrigin https://preview.example.org. Bu değer caller’ın amaçladığı destination origin’i daraltır; postMessage çağrısının dönmesi receiver’ın mesajı kabul ettiğini söylemez.

    Preview reply kaydı
    targetOrigin = preview origin
    Parent kabul kuralı
    Henüz değerlendirilmedi
    Başlık bağlama sonucu
    Henüz değerlendirilmedi
  2. Navigation farkı

    Frame-navigation satırında destination https://preview-v2.example.org olur. Delivery gate task sırasında current Document origin’ini değerlendirir ve exact hedefle uyuşmayan event’i teslim etmez.

    Preview reply kaydı
    targetOrigin = preview origin
    Parent kabul kuralı
    Destination changed / delivered false
    Başlık bağlama sonucu
    Henüz değerlendirilmedi
  3. Olmayan event’i sayma

    Bu branch için parent acceptance veya preview handler başarısı kaydı üretilemiyor. Çizimdeki karar sender’ın gerçek API’den otomatik bir delivery acknowledgment aldığı anlamına gelmiyor.

    Preview reply kaydı
    targetOrigin = preview origin
    Parent kabul kuralı
    Destination changed / delivered false
    Başlık bağlama sonucu
    No request event / acceptance absent
  4. Reference izin değildir

    Cross-origin iframe için WindowProxy reference var, directDomReadable false. Mesaj gönderebilecek bir reference’ın elde olması preview Document’ının DOM’unu okuma izni sağlamıyor.

    Preview reply kaydı
    WindowProxy available / DOM unreadable
    Parent kabul kuralı
    Destination changed / delivered false
    Başlık bağlama sonucu
    No request event / acceptance absent
  5. Lifecycle bağını koru

    Pending iş instance ve transaction’a bağlı kalıyor. Listener’ların hazır olduğu başlangıç kabul ediliyor; navigation, timeout veya listener race’in gerçek browser davranışı burada ölçülmüyor.

    Preview reply kaydı
    WindowProxy available / DOM unreadable
    Parent kabul kuralı
    Instance-bound pending work
    Başlık bağlama sonucu
    No request event / acceptance absent
  6. İki aşamalı sınır

    Exact destination gate ile application acceptance aynı kontrol değil. İlki event’in ulaşmasını daraltır, ikincisi ulaşan readonly sonucun doğru işe ait olup olmadığını değerlendirir.

    Preview reply kaydı
    WindowProxy available / DOM unreadable
    Parent kabul kuralı
    Instance-bound pending work
    Başlık bağlama sonucu
    Delivery ≠ application acceptance

VARSAYIM · SINIR · KONTROL

Origin tek başına hangi reply’yi seçer?

Atlas iki preview instance’ını aynı origin’den açmış olabilir. Instance-mismatch branch’inde reply origin’i doğrudur fakat source alias preview-two, pending request’in beklediği preview-one değildir. Parent onu kabul etmez. Bu normal widget wiring hatasıdır; başka hedefe müdahale veya payload değildir. Expected origin’in doğru olması hangi window ve hangi transaction’ın sonuç verdiğini tek başına belirlemez. Yanlış kabul edilirse etki bu readonly örnekte yanlış kitap başlığının gösterilmesidir; daha güçlü message action’ları kendi authorization sınırını ister.

Stale-reply branch’inde normal preview current request’i alır, ancak selected stale result tx-old etiketiyle döner. Parent current transaction’ıyla uyuşmadığı için title’ı güncellemez. Event delivery önce, application validation sonra görünür. Bir response’un message event olarak gelmesi schema veya transaction açısından kabul edildiği anlamına gelmez. Frame navigation branch’inde ise exact target gate uyuşmadığından hiç request event’i oluşmaz; sender otomatik delivery acknowledgment almış sayılmaz.

Opaque identity ve message şekli

Serialized null’un bütün opaque sender’ları aynı trusted widget yaptığı düşüncesi burada da yanlış olur. Schema’daki type/v/transaction/book alanları mesajın izin verilen readonly işini daraltır; data’yı HTML veya executable text gibi ele almak bu sözleşmenin dışındadır. Bu ders no-eval ve text-only result profili seçer, gerçek renderer çalıştırmaz. Kontrol etkisi, event acceptance ve selected display binding arasında tutulur; origin check’in API kullanıcı/tenant yetkisi verdiği iddia edilmez.

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

Hareket olmadan bütün senaryoları oku

Reply kontrolleri

  1. Normal reply kaydı

    Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. Normal reply, preview origin’i ve preview-one source’u ile tx-current taşıyor. type title-result, v 1 ve bookAlias atlas-notlari; title string olarak Atlas Notları.

    Event ledger
    Normal / tx-current / title string
    Correlation review
    Henüz değerlendirilmedi
    Kabul kanıtı
    Henüz değerlendirilmedi
  2. Olumlu kontrol

    Tüm kabul koşulları normal satırda geçiyor. Bu olumlu kontrol, daha sonra reddedilen sonuçların yalnız bozuk test altyapısından kaynaklanmadığını model düzeyinde karşılaştırmaya yarıyor.

    Event ledger
    Normal / tx-current / title string
    Correlation review
    Normal accepted true
    Kabul kanıtı
    Henüz değerlendirilmedi
  3. Olumsuzları ayır

    Stale-reply transaction’dan, instance-mismatch source’dan, shape-mismatch title 17 türünden ve origin-mismatch origin’den reddediliyor. Her neden aynı üst başlıkta kaybolmadan kaydediliyor.

    Event ledger
    Normal / tx-current / title string
    Correlation review
    Normal accepted true
    Kabul kanıtı
    Four independent rejection reasons
  4. Delivery kaydını ayır

    Normal delivery true, frame-navigation delivery false. Reply rejection ile hiç request event’i oluşmaması farklı aşamalardır; parent’ta boş reply listesi hangisinin yaşandığını tek başına açıklamaz.

    Event ledger
    Delivery normal true / navigation false
    Correlation review
    Normal accepted true
    Kabul kanıtı
    Four independent rejection reasons
  5. Dar correlation

    Expected source alias ve pending transaction birlikte tutuluyor. Event origin string’i pencere identity’sinin yerine geçmiyor; text sonucu kabulü server action yetkisiyle de birleştirilmiyor.

    Event ledger
    Delivery normal true / navigation false
    Correlation review
    Origin/source/transaction scopes retained
    Kabul kanıtı
    Four independent rejection reasons
  6. Regression sınırı

    Kabul matrisi normal ve ayrı olumsuz kontrolleri karşılaştırıyor. Gerçek iframe, clone, port transferi ve DOM render bu kayıttan doğrulanmış sayılmaz; bu sonuç yalnız message contract kararını açıklar.

    Event ledger
    Delivery normal true / navigation false
    Correlation review
    Origin/source/transaction scopes retained
    Kabul kanıtı
    Finite contract verified / browser unmeasured

Event boşluğu

  1. Boş reply görünümü

    Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. İnceleyenin elinde reply event kaydı yok. Bu yokluk, frame navigation ile delivery engeli, listener hazırlığı veya başka bir lifecycle durumunu tek başına seçtirmiyor.

    Event ledger
    Reply observation missing
    Correlation review
    Henüz değerlendirilmedi
    Kabul kanıtı
    Henüz değerlendirilmedi
  2. Bekleneni kopyalama

    Normal request ve response örneği tx-current için beklenen sözleşmeyi gösteriyor. Eksik trace’e normal origin/source/title alanları eklemek, gözlenmeyen bir acceptance sonucunu uydurur.

    Event ledger
    Reply observation missing
    Correlation review
    Expected contract ≠ missing event
    Kabul kanıtı
    Henüz değerlendirilmedi
  3. Belirsiz sonucu koru

    Event yokken title-result kabul edildi veya reddedildi diyemiyoruz. Current display’in değişmemesi de delivery kararını tek başına kanıtlamaz; farklı aşamalar aynı görünür sonuca ulaşabilir.

    Event ledger
    Reply observation missing
    Correlation review
    Expected contract ≠ missing event
    Kabul kanıtı
    Delivery/acceptance UNKNOWN
  4. Gerekli bağlamı seç

    Hedef origin’in task anındaki bağlamı, ilgili window instance’ı ve pending transaction kaydı gerekli. Gerçek ürün ölçümünde listener hazırlığı ve lifecycle zamanı da aynı işe bağlanmalı.

    Event ledger
    Needed: destination/instance/transaction
    Correlation review
    Expected contract ≠ missing event
    Kabul kanıtı
    Delivery/acceptance UNKNOWN
  5. Model sınırını oku

    Bu örneğin listenersReady true başlangıcı gerçek gecikme ölçümü değildir. HTTP kaydı da postMessage event’inin yerine geçmez; message delivery browser içindeki başka bir mekanizma.

    Event ledger
    Needed: destination/instance/transaction
    Correlation review
    Ready assumption / no HTTP evidence
    Kabul kanıtı
    Delivery/acceptance UNKNOWN
  6. Yeni kanıtın sorusu

    Yeni inceleme delivery, event receipt ve application acceptance’ı ayrı yanıtlamalı. Bu eksik kayıt için sonuç UNKNOWN kalıyor; normal fixture başlığı boşluğa yerleştirilmiyor.

    Event ledger
    Needed: destination/instance/transaction
    Correlation review
    Ready assumption / no HTTP evidence
    Kabul kanıtı
    Collect scoped event/acceptance evidence

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

Dar, instance’a bağlı mesaj kabulü

Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. Atlas expected origin’i configuration’dan, expected WindowProxy’yi açtığı selected iframe instance’ından alır. Sender exact targetOrigin kullanır; receiver origin, source ve schema’yı birlikte doğrular. Message source identity’si bir origin string’ine çevrilmez; aynı origin’deki iki window birbirinden ayrıdır. Type yalnız get-title/title-result, version yalnız 1, transaction yalnız pending tx-current, book yalnız selected readonly alias olur. Bilinmeyen type veya ek field sessizce güçlü action’a dönüşmez; selected schema’da reject edilir.

Regression normal result’i olumlu kontrol olarak kullanır; stale transaction, wrong instance, wrong shape ve current destination origin değişimini ayrı olumsuz kontrollerle sınar. Scene normal request event’ini preview’de pending bırakır, local acceptance sonrasında reply hazırlar, parent’ta response receipt ve validation’ı ayırır. Başlık ancak tüm selected reply gate’leri geçince display binding’e alınır. Dropped destination branch’i transfer çizmez; browser-local task gate’ini göstermesi sender’ın bu kararı gerçek API’den öğrendiği iddiası değildir.

Readiness ve lifecycle sınırı

Recipient readiness ve lifecycle de contract’ın parçasıdır. Listener hazırlanmış olmalı; iframe navigation document bağlamını değiştirirse pending işlemler ilgili instance için iptal edilmeli veya yeniden başlatılmalıdır. Model başlangıçta documents/listeners-ready varsayar. Bu varsayım gerçek browser timeout, WindowProxy navigation veya port transfer sonucu değildir; production lifecycle için bu olayların aynı instance ile ilişkilendirilmesi gerekir.

ŞİMDİ VAKAYA UYGULA

Mesajın gelmesi başlığı güncellemek için yeterli mi?

Atlas, preview-one penceresinden tx-current için Atlas Notları başlığını bekliyor. Aynı origin’den gelen tx-old yanıtı veya preview-two penceresinin sonucu bu işi tamamlamıyor. Frame başka origin’e taşındığında ise exact targetOrigin, request event’inin oluşmasını engelleyebiliyor.

Vakadaki browser policy hangi ilişkiyi kontrol ediyor? Response exposure, destination veya framing kararını server’ın object permission kararıyla karıştırmadan açıkla.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Readonly preview message sözleşmesi

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

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "parentOrigin": "https://atlas.example.org",
    "previewOrigin": "https://preview.example.org",
    "expectedParentWindow": "parent-one",
    "expectedPreviewWindow": "preview-one",
    "listenersReady": true,
    "currentTransaction": "tx-current",
    "exactTarget": true,
    "actualBrowser": false,
    "actualDOM": false,
    "actualPostMessage": false,
    "portTransfer": false,
    "scriptEvaluation": false
  },
  "iframe": {
    "normalCrossOrigin": true,
    "directDomReadable": false,
    "windowProxyReferenceAvailable": true,
    "sandboxOriginProfile": "not selected for messaging; opaque distinction taught separately",
    "sameOriginWouldNotBeIsolatedByElementAlone": true
  },
  "request": {
    "type": "get-title",
    "v": 1,
    "transactionAlias": "tx-current",
    "bookAlias": "atlas-notlari"
  },
  "response": {
    "type": "title-result",
    "v": 1,
    "transactionAlias": "tx-current",
    "bookAlias": "atlas-notlari",
    "title": "Atlas Notları"
  },
  "deliveryCases": [
    {
      "case": "normal",
      "targetOrigin": "https://preview.example.org",
      "currentDestinationOrigin": "https://preview.example.org",
      "expectedDelivered": true
    },
    {
      "case": "frame-navigation",
      "targetOrigin": "https://preview.example.org",
      "currentDestinationOrigin": "https://preview-v2.example.org",
      "expectedDelivered": false
    }
  ],
  "replyCases": [
    {
      "case": "normal",
      "origin": "https://preview.example.org",
      "sourceWindow": "preview-one",
      "data": {
        "type": "title-result",
        "v": 1,
        "transactionAlias": "tx-current",
        "bookAlias": "atlas-notlari",
        "title": "Atlas Notları"
      },
      "ports": [],
      "expected": true
    },
    {
      "case": "stale-reply",
      "origin": "https://preview.example.org",
      "sourceWindow": "preview-one",
      "data": {
        "type": "title-result",
        "v": 1,
        "transactionAlias": "tx-old",
        "bookAlias": "atlas-notlari",
        "title": "Earlier Atlas title"
      },
      "ports": [],
      "expected": false
    },
    {
      "case": "instance-mismatch",
      "origin": "https://preview.example.org",
      "sourceWindow": "preview-two",
      "data": {
        "type": "title-result",
        "v": 1,
        "transactionAlias": "tx-current",
        "bookAlias": "atlas-notlari",
        "title": "Atlas Notları"
      },
      "ports": [],
      "expected": false
    },
    {
      "case": "shape-mismatch",
      "origin": "https://preview.example.org",
      "sourceWindow": "preview-one",
      "data": {
        "type": "title-result",
        "v": 1,
        "transactionAlias": "tx-current",
        "bookAlias": "atlas-notlari",
        "title": 17
      },
      "ports": [],
      "expected": false
    },
    {
      "case": "origin-mismatch",
      "origin": "https://preview-v2.example.org",
      "sourceWindow": "preview-one",
      "data": {
        "type": "title-result",
        "v": 1,
        "transactionAlias": "tx-current",
        "bookAlias": "atlas-notlari",
        "title": "Atlas Notları"
      },
      "ports": [],
      "expected": false
    }
  ],
  "deliverySemantics": {
    "callReturnIsAcknowledgement": false,
    "originCapturedAtSenderCall": true,
    "sourceIsWindowProxy": true,
    "receiverCurrentDocumentOriginCheckedAtTask": true,
    "applicationValidationAfterEvent": true,
    "httpTraffic": false
  },
  "omitted": [
    "actual iframe creation/navigation/sandbox",
    "full structured clone",
    "browser event loop and listener races",
    "MessageChannel/MessagePort transfer",
    "timeouts and multiple asynchronous replies",
    "API authorization and DOM rendering"
  ]
}
iframe
WindowProxy reference DOM izni değildir; sandbox ayrı sınırlardır.
request
Exact readonly message schema ve pending transaction.
deliveryCases
Task anında receiver origin’e bağlı delivery gate.
replyCases
Receiver origin/source/schema/transaction conjunction.
deliverySemantics
API call dönüşü, event receipt ve acceptance ayrı.

Window/source kimlikleri alias’tır; events inert JSON’dur. Browser, actual postMessage, HTTP, DOM, clone veya port transferi çalıştırılmaz.

İki yanlış kanı

contentWindow varsa iframe DOM’u okunabilir.

Cross-origin WindowProxy sınırlı yüzey verir; direct DOM access ayrı origin gate’ine bağlıdır.

event.origin doğruysa reply kabul edilir.

Selected window source, readonly schema ve current transaction da eşleşmelidir.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

Reply doğru origin ve source’dan geliyor, fakat tx-old taşıyor. Güncel title sonucu olarak kabul edilir mi?

  1. Hayır. Eski reply güncel transaction’a ait değil.
  2. Evet. Doğru origin’den gelen bütün eski reply’lar günceldir.
Gerekçeli cevabı oku

Hayır. Eski reply güncel transaction’a ait değil. — Güncel transaction tx-current. Aynı Window ve origin’den gelse de tx-old bu işlemin sonucu değildir.

Frame preview-v2’ye navigate oldu; targetOrigin hâlâ preview. postMessage çağrısının dönmesi delivery ACK’i midir?

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

deliveryCases[1]
{"case":"frame-navigation","targetOrigin":"https://preview.example.org","currentDestinationOrigin":"https://preview-v2.example.org","expectedDelivered":false}
deliverySemantics.callReturnIsAcknowledgement
false
  1. Evet. WindowProxy aynıysa origin değişimi önemsizdir.
  2. Hayır. expectedDelivered=false; çağrının dönmesi ACK değildir.
Gerekçeli cevabı oku

Hayır. expectedDelivered=false; çağrının dönmesi ACK değildir. — Exact target origin eşleşmesi yoksa delivery gerçekleşmez. postMessage return değeri application acknowledgement değildir.

Origin doğru, fakat sourceWindow=preview-two olan reply neden reddedilir? Message biçimi ve title type kontrolünü de açıkla.

Gerekçeli cevabı oku

Beklenen WindowProxy preview-one instance’ına aittir. preview-two aynı origin’de olsa da bu konuşmanın tarafı değildir. data type, version, book, transaction ve title alanının string olması da doğrulanmalıdır. Message’ın kabul edilmesi tek başına API resource izni veya DOM rendering kanıtı değildir.

□ Origin ile beklenen source instance’ını ayırdım.

□ Message biçimi ve transaction kontrollerini korudum.

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

Kaynaklar ve kapsam

  • WHATWG HTML — Cross-document messaging§9.3.2.1 Authors: expected origin, expected format, targetOrigin · §9.3.3 Posting messages: structured serialization, queued task, target origin check, event source/origin/data/ports · §9.4 Channel messaging: separate messaging surface
  • MDN — Window.postMessage()Parameters: targetOrigin, transfer; Return value · The dispatched event: origin, source, data · Security concerns; Notes
  • WHATWG HTML — Origins and sandboxing§7.1.1 Origins: tuple/opaque, serialization, same-origin equality · §7.1.1.1 Sites; §7.1.1.2 Relaxing the same-origin restriction · §7.1.5 Sandboxing: sandboxed origin and scripts flags
  • MDN — Same-origin policyDefinition of an origin; Inherited origins; File origins · Cross-origin network access: writes, embeds, reads · Cross-origin script API access: Window and Location · Cross-origin data storage access