document.domain = document.domain ทำอะไร?


91

คอมโพเนนต์ JS ฝั่งไคลเอ็นต์ของOrbited (เซิร์ฟเวอร์ Comet) กำหนดให้หากเซิร์ฟเวอร์กำลังทำงานบนโดเมนอื่นหรือพอร์ตไปยัง JS เองคุณต้องดำเนินการ

document.domain = document.domain;

ก่อนที่จะโหลด JS อื่น ๆ (ดูเอกสารประกอบ )

สิ่งนี้ทำอะไร? ดูเหมือนว่า NOOP! (ฉันตรวจสอบแล้วและมีความจำเป็นจริง ๆ )

คำตอบ:


205

ฉันเขียนโค้ดนี้จริงๆ

เมื่อพยายามทำ cross-subdomain / port comet iframe จะต้องมีdocument.domainค่าเดียวกับเฟรมหลัก น่าเสียดายที่เบราว์เซอร์เก็บชื่อโดเมนและพอร์ตไว้ภายในสำหรับdocument.domainค่าดั้งเดิม แต่ getter และ setter ใน javascript ไม่รู้อะไรเกี่ยวกับพอร์ต ปัญหาก็คือถ้ากรอบด้านบนdocument.domainเป็น('example.com', 80)และกรอบล่างเป็น('comet.example.com', 80)อย่างไรคุณจะทำให้กรอบด้านล่าง('example.com', 80)เป็นอย่างไร?

คุณไม่สามารถทำได้เนื่องจากการเปลี่ยนส่วนชื่อโฮสต์จำเป็นต้องทำให้พอร์ตถูกตั้งค่าเป็นnullดังนั้นสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือ('example.com', null)ในกรอบด้านล่าง ดังนั้นกรอบด้านบนจึงต้องตั้งค่าเป็นค่านั้นด้วยและการตั้งค่าdocument.domain=document.domainก็ทำได้เช่นนั้น มันเปลี่ยนการแสดงภายในเบราว์เซอร์จาก('example.com', 80)เป็น('example.com', null)และจากนั้นทุกอย่างตรงกันและการสื่อสารข้ามพอร์ต / โดเมนย่อยทำงานได้


ขออภัยวิธีนี้ใช้ไม่ได้ผลสำหรับฉัน (ดูรายละเอียดในstackoverflow.com/questions/7796767/… ) การเพิ่ม 'document.domain = document.domain' ลงในเฟรมทั้งหมดจะไม่เปลี่ยนพฤติกรรมของ Chrome ความคิดใด ๆ ?
Stephen Gross

นอกจากนี้ฉันพบว่าถ้าฉันตั้งค่าความล่าช้าสำหรับ js ของฉันอย่างน้อยฉันก็จะได้รับ URL ที่ดูถูกต้องสำหรับทั้งสองเฟรม อย่างไรก็ตามเฟรมหนึ่งไม่สามารถเข้าถึงอีกเฟรมได้
Stephen Gross

6
มีคำอธิบายอีกอย่างว่าพอร์ต "ซ่อน" แปลก ๆ ทำงานอย่างไรที่ MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
อ่าคุณเป็นตัวการสำหรับรหัสที่น่าโมโหนี้ ขอบคุณบรรทัดดังกล่าวหลังจากเรียกใช้ (และชุด document.domain) iframe ที่สร้างแบบไดนามิกใด ๆ จะถูกตั้งค่าเป็นแบบข้ามโดเมนดังนั้นจึงไม่สามารถเข้าถึง iframe ที่สร้างขึ้นใหม่ได้อีกต่อไป : /
crappish

@mjs ใช่: เบราว์เซอร์จะเก็บหมายเลขพอร์ตแยกกัน การเรียกใช้ setter ใด ๆ รวมถึง document.domain = document.domain ทำให้หมายเลขพอร์ตถูกเขียนทับด้วย null ดังนั้นจึงไม่สามารถทำให้ company.com:8080 คุยกับ company.com ได้โดยการตั้งค่า document.domain = "company.com" ในครั้งแรกเท่านั้น ต้องตั้งค่าทั้งสองอย่างเพื่อให้หมายเลขพอร์ตเป็นโมฆะทั้งคู่
Royi Namir

38

เบราว์เซอร์แยกความแตกต่างระหว่าง (a) document.domain เมื่อไม่ได้ตั้งค่าอย่างชัดเจนและ (b) document.domain เมื่อตั้งค่าอย่างชัดเจน ... แม้ว่าจะส่งคืนค่าเดียวกันก็ตาม

การตั้งค่าอย่างชัดเจนบ่งบอกถึงเจตนาที่จะ "ร่วมมือ" กับสคริปต์บนโดเมนย่อยอื่น (ภายใต้โดเมนหลักเดียวกัน)

ถ้าทั้งเพจพาเรนต์และสคริปต์ภายนอกตั้งค่า document.domain อย่างชัดเจนเป็นค่าเดียวกันข้อ จำกัด ของนโยบายที่มาเดียวกันอาจถูกข้ามไปและแต่ละสคริปต์อาจเข้าถึงอ็อบเจ็กต์และคุณสมบัติทั้งหมด (ที่ถูก จำกัด ไว้เป็นอย่างอื่น) และคุณสมบัติของบริบทของกันและกัน


9

ผมพบว่าข้อมูลต่อไปนี้ในเว็บไซต์นี้: devguru เป็นรูปธรรมมากขึ้นนี่คือคำพูด:

คุณสมบัตินี้ตั้งค่าหรือส่งคืนชื่อโดเมนของเซิร์ฟเวอร์ที่มาของเอกสาร ค่าเริ่มต้นนี้เป็นชื่อโดเมนของเซิร์ฟเวอร์ที่เอกสารถูกดึงกลับมา แต่สามารถเปลี่ยนเป็นคำต่อท้าย (และเฉพาะคำต่อท้าย) ของชื่อนี้ สิ่งนี้ช่วยให้สามารถแบ่งปันคุณสมบัติของสคริปต์การอนุญาตการรักษาความปลอดภัยระหว่างเอกสารที่ส่งมาจากเซิร์ฟเวอร์ที่แตกต่างกันโดยให้พวกเขาแชร์ส่วนต่อท้ายโดเมนเดียวกัน

สำหรับฉันแล้วดูเหมือนว่าจะอนุญาตให้มีการเขียนสคริปต์ข้ามไซต์สำหรับโดเมนเดียวกัน (แม้ว่าโดเมนย่อยจะแตกต่างกัน)

ฉันคิดว่าถ้าคุณไม่แตะ document.domain เอ็นจิ้น js จะอนุญาตเฉพาะจาวาสคริปต์อื่นจากโดเมนเดียวกัน ด้วยคุณสมบัติดังกล่าวคุณจะสามารถปรับใช้กับโดเมนย่อยอื่น ๆเช่นสถานะเอกสารที่โคจร


6
แต่นั่นไม่ได้อธิบายว่าทำไมdocument.domain = document.domainเป็นไม่ NOOP
Crescent Fresh

1
เป็นเพียงการคาดเดา แต่อย่างที่ฉันพูดฉันเดาว่าคุณสมบัติจะถูกทริกเกอร์เมื่อใดก็ตามที่ตั้งค่าเป็นค่า
Miguel Ping

6

การdocument.domainดึงค่าเริ่มต้นจาก URL จริงหากไม่ได้ตั้งค่าไว้อย่างชัดเจน เบราว์เซอร์จะบันทึกว่าdocument.domainได้มาเป็นค่าเริ่มต้นจาก URL หรือหากตั้งค่าไว้อย่างชัดเจน ทั้งสองต้องเป็นค่าเริ่มต้นสำหรับโดเมนเดียวกันหรือทั้งสองอย่างต้องตั้งค่าเป็นโดเมนเดียวกันอย่างชัดเจนเพื่อให้การทำงานนี้ใช้งานได้ หากค่าเริ่มต้นเป็นค่าเริ่มต้นและมีการตั้งค่าไว้อย่างชัดเจนทั้งสองหน้าตรงกันหากอ่านแล้วทั้งสองหน้าจะยังคงถูกห้ามไม่ให้พูดคุยกัน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.