Jika situs Anda mengandalkan setelan document.domain, Anda harus melakukan tindakan.
Apa yang berubah, dan mengapa?
Mulai Chrome 115, situs tidak akan dapat menetapkan document.domain: Chrome akan membuat document.domain menjadi tidak dapat diubah. Untuk berkomunikasi lintas origin, Anda harus menggunakan pendekatan alternatif, seperti postMessage() atau Channel Messaging API.
Perhatikan bahwa perubahan ini akan diluncurkan secara bertahap.
Kami berharap browser lain pada akhirnya akan menghentikan penggunaan dan menghapus fungsi ini. Tinjau bagian kompatibilitas browser untuk mengetahui detailnya.
Mengapa document.domain dibuat tidak dapat diubah?
document.domain
dirancang untuk mendapatkan atau menetapkan nama host asal. Banyak situs menetapkan
document.domain untuk mengizinkan komunikasi antara halaman lintas origin tetapi situs yang sama.
Meskipun merupakan teknik yang praktis, teknik ini menimbulkan risiko keamanan, karena melonggarkan kebijakan origin yang sama.
Masalah keamanan terkait document.domain telah menyebabkan perubahan pada spesifikasi yang memperingatkan pengguna untuk tidak menggunakannya.
Secara mendetail: Mengapa document.domain harus bersifat immutable?
Cara penggunaan document.domain saat ini
Banyak situs menyetel document.domain untuk mengizinkan komunikasi antara halaman same-site tetapi lintas origin.
Situs lintas asal yang sama memiliki eTLD+1 yang sama, tetapi subdomain yang berbeda.
Berikut penggunaan document.domain hingga saat ini:
Misalnya, halaman di https://parent.example.com menyematkan halaman iframe dari
https://video.example.com. Halaman ini memiliki eTLD+1 yang sama (example.com)
dengan subdomain yang berbeda. Jika document.domain kedua halaman ditetapkan ke
'example.com', browser akan memperlakukan kedua origin seolah-olah keduanya adalah origin yang sama.
Tetapkan document.domain untuk https://parent.example.com:
// Confirm the current origin of "parent.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
Tetapkan document.domain untuk https://video.example.com:
// Confirm the current origin of "video.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
Sekarang Anda dapat membuat manipulasi DOM lintas origin di
https://parent.example.com terhadap https://video.example.com.
Situs menetapkan document.domain untuk memungkinkan dokumen same-site berkomunikasi dengan lebih mudah. Karena perubahan ini melonggarkan kebijakan dari origin yang sama,
halaman induk dapat mengakses dokumen iframe dan menjelajahi
pohon DOM, dan sebaliknya.
Ini adalah teknik yang mudah, tetapi menimbulkan risiko keamanan.
Masalah keamanan terkait document.domain
Masalah keamanan terkait document.domain telah menyebabkan perubahan pada
spesifikasi yang memperingatkan pengguna untuk menghindari penggunaannya.
Misalnya, saat dua halaman menetapkan document.domain, keduanya dapat berpura-pura seolah-olah berasal dari origin yang sama. Hal ini sangat penting jika halaman ini menggunakan layanan hosting bersama dengan subdomain yang berbeda. Menyetel document.domain membuka
akses ke semua situs lain yang dihosting oleh layanan yang sama, sehingga memudahkan
penyerang mengakses situs Anda. Hal ini memungkinkan karena document.domain
mengabaikan bagian nomor port dari domain.
Untuk mempelajari lebih lanjut implikasi keamanan dari setelan document.domain,
baca halaman "Document.domain" di MDN.
Kompatibilitas browser
- Spesifikasi HTML menyatakan bahwa fitur harus dihapus.
- Mozilla menganggap bahwa menonaktifkan
document.domainsecara default layak untuk dibuat prototipenya. - WebKit menunjukkan bahwa mereka cukup positif tentang penghentian penggunaan setter
document.domain. - Diskusi dengan vendor browser lain
- Permintaan Pull WHATWG / HTML working group (menunggu pengalaman eksperimen)
Bagaimana cara mengetahui apakah situs saya terpengaruh?
Jika situs Anda terpengaruh oleh perubahan ini, Chrome akan memperingatkan Anda di panel Masalah DevTools — peringatan ini telah ditambahkan pada tahun 2022. Perhatikan tanda kuning di kanan atas DevTools.

Anda juga dapat menjalankan situs melalui audit API yang tidak digunakan lagi LightHouse untuk menemukan semua API yang dijadwalkan untuk dihapus dari Chrome.
Jika Anda telah menyiapkan Reporting API, Chrome telah mengirimkan laporan penghentian penggunaan kepada Anda untuk memberi tahu Anda tentang penghentian penggunaan yang akan datang ini. Pelajari lebih lanjut cara menggunakan Reporting API dengan layanan pengumpulan laporan yang ada atau dengan membuat solusi internal Anda sendiri.
Bagaimana cara melihat perubahan ini diterapkan?
Perubahan ini akan diluncurkan secara progresif, mulai dari Chrome 115. Untuk melihat perubahan ini diterapkan meskipun belum diluncurkan di browser Chrome Anda, Anda dapat mengaktifkannya sebagai berikut:
- Buka
chrome://flags/#origin-agent-cluster-default - Pilih Aktifkan.
- Mulai ulang Chrome.
Apa saja alternatif yang dapat saya gunakan?
Pilihan terbaik adalah tidak memodifikasi document.domain sama sekali, misalnya dengan menghosting halaman dan semua frame penyusun di origin yang sama. Cara ini berfungsi di
semua versi semua browser. Namun, hal ini mungkin memerlukan pengerjaan ulang aplikasi yang substansial, jadi sebaiknya lihat juga alternatif yang terus mendukung akses lintas origin.
Gunakan postMessage() atau Channel Messaging API, bukan document.domain
Dalam sebagian besar kasus penggunaan, postMessage() lintas origin
atau Channel Messaging API
dapat menggantikan document.domain.
Dalam contoh berikut:
https://parent.example.commemintahttps://video.example.comdalam iframe untuk memanipulasi DOM dengan mengirim pesan melaluipostMessage().https://video.example.commemanipulasi DOM segera setelah menerima pesan dan memberi tahu keberhasilan kembali ke induk.https://parent.example.commengakui keberhasilan.
Di https://parent.example.com:
// 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
}
});
Di https://video.example.com:
// 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);
});
Coba dan lihat cara kerjanya. Jika Anda memiliki persyaratan khusus yang tidak akan berfungsi dengan postMessage() atau Channel Messaging API, beri tahu kami di Twitter melalui @ChromiumDev atau ajukan pertanyaan di Stack Overflow dengan tag document.domain.
Sebagai upaya terakhir, kirim header Origin-Agent-Cluster: ?0
Jika Anda memiliki alasan kuat untuk terus menyetel document.domain, Anda dapat mengirim
header respons Origin-Agent-Cluster: ?0 bersama dengan dokumen target.
Origin-Agent-Cluster: ?0
Header Origin-Agent-Cluster menginstruksikan browser apakah dokumen
harus ditangani oleh cluster agen dengan kunci origin atau tidak. Untuk mempelajari lebih lanjut
Origin-Agent-Cluster, baca Meminta isolasi performa dengan header Origin-Agent-Cluster.
Saat Anda mengirim header ini, dokumen Anda dapat terus menetapkan document.domain
bahkan setelah menjadi tidak dapat diubah secara default.
Semua dokumen lain yang memerlukan perilaku tersebut juga harus mengirimkan
Origin-Agent-Cluster (perhatikan bahwa document.domain tidak akan berpengaruh jika hanya satu
dokumen yang menetapkannya).
Mengonfigurasi OriginAgentClusterDefaultEnabled untuk kebijakan perusahaan
Secara opsional, admin Anda dapat mengonfigurasi kebijakan OriginAgentClusterDefaultEnabled ke false agar document.domain dapat disetel secara default di instance Chrome di seluruh organisasi Anda. Untuk mempelajari lebih lanjut, baca Daftar & Pengelolaan Kebijakan Chrome Enterprise | Dokumentasi.
Resource
Document.domain- Web API | MDN- Isolasi Origin dan Penghentian Penggunaan
document.domain - Menghentikan penggunaan
document.domain. · Masalah #564 · w3ctag/design-reviews
Ucapan terima kasih
Foto oleh Finan Akbar di Unsplash