Chrome, aynı kaynak politikasını gevşetmek için document.domain alanının değiştirilmesini devre dışı bırakacak

Web siteniz document.domain ayarlamasına bağlıysa işlem yapmanız gerekir.

Eiji Kitamura
Eiji Kitamura

Güncellemeler

  • 30 Mayıs 2023: document.domain setter öğesinin kullanımdan kaldırılmasının Chrome 115'te geçerli olacağını duyurmuştuk.
  • 7 Nisan 2023: Chrome 112'de bu değişikliği göndermeden önce bir sorun tespit ettik. Varsayılan olarak kaldırılacak document.domain hazırlayıcı şu anda askıya alınmış durumda ve yeni gönderim aşaması henüz belirlenmedi. Lütfen bu blog yayınını tekrar kontrol edin veya blink-dev ile bu ileti dizisine abone olun.
  • 20 Ocak 2023: Güncellenen zaman çizelgesi: Chrome 112'den itibaren document.domain setter varsayılan olarak kaldırılacak. Ayrıca, document.domain davranışını kontrol etmek için kurumsal politikadan bahsedildi.
  • 25 Temmuz 2022: Güncellenen zaman çizelgesi: Chrome 109 sürümünden itibaren document.domain setter varsayılan olarak kaldırılacak.
  • 4 Şubat 2022: Yeni zaman çizelgesiyle güncellendi. Chrome 100'den itibaren Sorunlar panelinde bir uyarı gösterilecek. Chrome 106'dan itibaren varsayılan olarak document.domain ayarlayıcı kaldırılacak.

document.domain, kaynağın ana makine adını alacak veya ayarlayacak şekilde tasarlanmıştır.

Chrome'da, web siteleri document.domain özelliğini ayarlayamaz. Kaynaklar arası iletişim kurmak için postMessage() veya Channel Messaging API gibi alternatif yaklaşımlar kullanmanız gerekecektir. Chrome 112'nin bu değişikliği en kısa sürede göndermesini hedefliyoruz. Ancak bu, Gönderim Amacı'na verilen yanıta bağlıdır.

Web siteniz doğru şekilde çalışmak için document.domain aracılığıyla aynı kaynak politikası gevşetilmesini kullanıyorsa sitenin bu davranışı gerektiren diğer tüm dokümanlar gibi bir Origin-Agent-Cluster: ?0 üst bilgisi göndermesi gerekir (yalnızca tek bir belge ayarlarsa document.domain etkili olmaz).

document.domain neden sabit olmalı?

Birçok web sitesi document.domain özelliğini aynı site ancak çapraz kaynak sayfalar arasında iletişime izin verecek şekilde ayarlar.

Bu özelliğin nasıl kullanıldığı aşağıda açıklanmıştır:

https://parent.example.com alanındaki bir sayfanın, https://video.example.com web sitesindeki bir iFrame sayfasını yerleştirdiğini varsayalım. Bu sayfalar farklı alt alan adlarıyla aynı eTLD+1'e (example.com) sahiptir. Her iki sayfanın da document.domain değeri 'example.com' olarak ayarlandığında, tarayıcı iki kaynağı da aynı kaynak gibi değerlendirir.

https://parent.example.com için document.domain değerini ayarlayın:

// Confirm the current origin of "parent.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

https://video.example.com için document.domain değerini ayarlayın:

// Confirm the current origin of "video.example.com"
console.log(document.domain);

// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);

Artık https://parent.example.com üzerinde https://video.example.com öğesine karşı kaynaklar arası DOM manipülasyonu oluşturabilirsiniz.

Web siteleri, aynı sitedeki belgelerin daha kolay iletişim kurmasını sağlamak için document.domain özelliğini ayarlar. Bu değişiklik aynı kaynak politikasını gevşetdiğinden, üst sayfa iframe'in dokümanına erişip DOM ağacına geçiş yapabilir (ve bunun tersi de geçerlidir).

Bu, kullanışlı bir teknik olmakla birlikte, güvenlik riski de beraberinde getirir.

document.domain ile ilgili güvenlik sorunları

document.domain ile ilgili güvenlik endişeleri nedeniyle spesifikasyonda, kullanıcıları bu özelliği kullanmamaları konusunda uyaran bir değişiklik yapılmıştır. Diğer tarayıcı tedarikçileriyle olan mevcut tartışma da aynı yönde ilerliyor.

Örneğin, iki sayfa document.domain olarak ayarlandığında aynı kaynak gibi davranabilirler. Bu durum, özellikle bu sayfalar farklı alt alan adlarına sahip paylaşılan bir barındırma hizmeti kullandığında büyük önem taşır. document.domain hizmetini ayarlamak, aynı hizmet tarafından barındırılan diğer tüm sitelere erişim sağlar. Bu da saldırganların sitelerinize erişmesini kolaylaştırır. document.domain, alan adının bağlantı noktası numarası bölümünü yoksaydığı için bu mümkündür.

document.domain ayarının güvenlik açısından sonuçları hakkında daha fazla bilgi edinmek için MDN'deki "Document.domain" sayfasını okuyun.

Chrome, document.domain sürümünü Chrome 112'de sabit hale getirmeyi planlamaktadır.

Sitemin etkilenip etkilenmediğini nasıl anlarım?

Web siteniz bu değişiklikten etkilenirse Chrome, Geliştirici Araçları'ndaki Sorunlar panelinde uyarı gönderir. Sağ üst köşedeki sarı bayrağa dikkat edin.

document.domain değiştirildiğinde, Sorunlar panelinde bir uyarı
gösterilir.
document.domain değiştirildiğinde, Sorunlar panelinde bir uyarı gösterilir.

Raporlama uç noktası ayarladıysanız kullanımdan kaldırma raporları da gönderilir. Mevcut rapor toplama hizmetleriyle veya kendi şirket içi çözümünüzü oluşturarak Reporting API'yi kullanma hakkında daha fazla bilgi edinin.

Chrome'dan kaldırılması planlanan tüm API'leri bulmak için sitenizi LightHouse'un desteği sonlandırılmış API denetimi bölümünden çalıştırabilirsiniz.

Kökler arası alternatif iletişim

Şu anda web siteniz için document.domain yerine üç farklı seçenek sunuluyor.

postMessage() veya Channel Messaging API'yi kullanın

Çoğu kullanım durumunda, document.domain yerine çapraz kaynak postMessage() veya Channel Messaging API kullanılabilir.

Aşağıdaki örnekte:

  1. https://parent.example.com, postMessage() aracılığıyla bir mesaj göndererek DOM'yi değiştirmek için bir iframe içinde https://video.example.com isteğinde bulunur.
  2. https://video.example.com, mesajı alır almaz DOM'u değiştirir ve başarılı olanı üst yöneticiye bildirir.
  3. https://parent.example.com başarı için teşekkür ediyor.

https://parent.example.com tarihinde:

// Send a message to https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');

// Receive messages
iframe.addEventListener('message', (event) => {
  // Reject all messages except ones from https://video.example.com
  if (event.origin !== 'https://video.example.com') return;

  // Filter success messages
  if (event.data === 'succeeded') {
    // DOM manipulation is succeeded
  }
});

https://video.example.com tarihinde:

// Receive messages
window.addEventListener('message', (event) => {
  // Reject all messages except ones from https://parent.example.com
  if (event.origin !== 'https://parent.example.com') return;

  // Do a DOM manipulation on https://video.example.com.

  // Send a success message to https://parent.example.com
  event.source.postMessage('succeeded', event.origin);
});

Deneyin ve nasıl çalıştığını görün. postMessage() veya Channel Messaging API ile çalışmayan belirli gereksinimleriniz varsa @ChromiumDev üzerinden Twitter üzerinden bize bildirin veya Stack Overflow'da document.domain etiketiyle sorun.

Son çare olarak Origin-Agent-Cluster: ?0 başlığını gönderin

document.domain ayarlamasına devam etmek için geçerli nedenleriniz varsa hedef belgeyle birlikte Origin-Agent-Cluster: ?0 yanıt başlığı gönderebilirsiniz.

Origin-Agent-Cluster: ?0

Origin-Agent-Cluster başlığı, tarayıcıya, dokümanın kaynak içeren veya kaynaklarla ilişkili aracı kümesi tarafından işlenip işlenmeyeceğini bildirir. Origin-Agent-Cluster hakkında daha fazla bilgi edinmek için Origin-Agent-Cluster başlığıyla performans yalıtımı isteme bölümünü okuyun.

Bu üst bilgiyi gönderdiğinizde dokümanınız, varsayılan olarak sabit hale geldikten sonra bile document.domain ayarını ayarlamaya devam edebilir.

Kurumsal politika için OriginAgentClusterDefaultEnabled yapılandırın

İsteğe bağlı olarak yöneticiniz, OriginAgentClusterDefaultEnabled politikasını false olarak yapılandırabilir ve document.domain politikasını kuruluşunuz genelindeki Chrome örneklerinde varsayılan olarak ayarlanabilir. Daha fazla bilgi edinmek için Chrome Enterprise Politika Listesi ve Yönetimi | Dokümanlar başlıklı makaleyi inceleyin.

Tarayıcı uyumluluğu

Kaynaklar

Teşekkür

Fotoğraf: Braydon Anderson tarafından Unsplash'te