Apa yang dilakukan document.domain = document.domain?

90

Komponen JS sisi klien dari Orbited (server Comet), mengharuskan jika server berjalan pada domain atau port yang berbeda dengan JS itu sendiri, Anda harus mengeksekusi

document.domain = document.domain;

sebelum JS lainnya dimuat. (Lihat dokumentasinya .)

Apa fungsinya? Sepertinya NOOP! (Saya sudah memeriksanya dan itu sebenarnya perlu.)

mjs
sumber

Jawaban:

203

Saya sebenarnya menulis kode ini.

Saat mencoba melakukan cross-subdomain / port comet, iframe harus memiliki nilai yang sama document.domaindengan kerangka induk. Sayangnya, browser menyimpan nama domain DAN port secara internal untuk nilai aslinya document.domain. Tapi pengambil dan penyetel di javascript tidak tahu apa-apa tentang port. Jadi masalahnya adalah ini: jika bingkai atas document.domainadalah ('example.com', 80), dan bingkai bawah adalah ('comet.example.com', 80), bagaimana Anda mendapatkan bingkai bawah ('example.com', 80)juga?

Anda tidak bisa, karena mengubah bagian nama host akan menyebabkan port diatur ke null, jadi yang terbaik yang dapat Anda lakukan adalah ('example.com', null)di bingkai bawah. Jadi bingkai atas juga perlu disetel ke nilai itu, dan setelan document.domain=document.domaintidak hanya itu. Ini mengubah representasi internal di browser dari ('example.com', 80)menjadi ('example.com', null)dan kemudian semuanya cocok dan komunikasi bingkai lintas-port / subdomain berfungsi.

Michael Carter
sumber
Sayangnya, solusi ini tidak berhasil untuk saya (lihat stackoverflow.com/questions/7796767/… untuk detailnya). Menambahkan 'document.domain = document.domain' ke semua bingkai tidak mengubah perilaku Chrome. Ada ide?
Stephen Gross
Juga, saya menemukan bahwa jika saya menetapkan penundaan untuk js saya, saya setidaknya mendapatkan URL yang tampak valid untuk kedua frame. Namun, bagaimanapun, satu frame tidak dapat mengakses yang lain.
Stephen Gross
6
Ada penjelasan lain tentang bagaimana port aneh "tersembunyi" bekerja di MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs
1
Ah, jadi Anda adalah biang keladi dari kode yang menyebalkan ini. Berkat baris tersebut, setelah dijalankan (dan document.domain disetel), iframe yang dibuat secara dinamis disetel sebagai lintas-domain dan dengan demikian iframe yang baru dibuat tidak dapat diakses lagi. : /
crappish
@mjs yes: Nomor port disimpan secara terpisah oleh browser. Setiap panggilan ke penyetel, termasuk document.domain = document.domain menyebabkan nomor port ditimpa dengan null. Oleh karena itu seseorang tidak dapat membuat company.com:8080 berbicara dengan company.com dengan hanya mengatur document.domain = "company.com" di awal. Ini harus disetel di keduanya sehingga nomor port keduanya nol.
Royi Namir
38

Browser membedakan antara (a) document.domain saat tidak disetel secara eksplisit dan (b) document.domain saat disetel secara eksplisit ... meskipun mereka mengembalikan nilai yang sama.

Menyetel nilai secara eksplisit menunjukkan niat untuk "bekerja sama" dengan skrip di subdomain lain (di bawah domain induk yang sama).

Jika KEDUA laman induk DAN skrip eksternal secara eksplisit menyetel document.domain ke nilai yang sama, pembatasan kebijakan asal yang sama dapat dilewati dan setiap skrip dapat mengakses semua objek (jika tidak dibatasi) dan properti konteks satu sama lain.

setiap minggu
sumber
9

Saya menemukan info berikut di situs ini: devguru . Lebih konkretnya, inilah kutipannya:

Properti ini menetapkan atau mengembalikan nama domain server tempat dokumen berasal. Ini secara default ke nama domain server tempat dokumen itu diambil, tetapi dapat diubah menjadi sufiks (dan hanya sufiks) dari nama ini. Hal ini memungkinkan berbagi properti skrip, keamanan memungkinkan, antara dokumen yang dikirim dari server yang berbeda asalkan mereka berbagi sufiks domain yang sama.

Menurut saya, ini memungkinkan pembuatan skrip lintas situs untuk domain yang sama (meskipun subdomain berbeda).

Saya kira jika Anda tidak menyentuh document.domain, mesin js hanya mengizinkan javascript lain dari domain yang sama. Dengan properti itu, Anda akan dapat menerapkan ke sub-domain lain seperti status dokumen yang mengorbit.

Miguel Ping
sumber
6
Itu tidak menjelaskan mengapa document.domain = document.domainadalah tidak noop a.
Crescent Fresh
1
Hanya tebakan liar, tapi seperti yang saya katakan, saya rasa properti hanya terpicu setiap kali disetel ke nilai.
Miguel Ping
6

The document.domainmenarik default dari URL yang sebenarnya jika tidak secara eksplisit diatur. Browser akan merekam jika document.domaintelah datang sebagai default dari URL atau jika ditetapkan secara eksplisit. Keduanya harus menjadi default untuk domain yang sama atau keduanya harus secara eksplisit diatur ke domain yang sama agar ini berfungsi. Jika salah satunya adalah default dan satu ditetapkan secara eksplisit, keduanya cocok jika dibaca, kedua halaman tersebut masih akan dilarang untuk berbicara satu sama lain.

Lihat: https://developer.mozilla.org/en-US/docs/DOM/document.domain

Charlie
sumber