หากเว็บไซต์ใช้การตั้งค่า document.domain
คุณจำเป็นต้องดำเนินการ
อัปเดต
- 30 พฤษภาคม 2023: เราได้ประกาศว่าการเลิกใช้งานตัวตั้งค่า
document.domain
จะมีผลใน Chrome 115 - 7 เมษายน 2023: เราพบปัญหา
ก่อนที่จะเปิดตัวการเปลี่ยนแปลงนี้ใน Chrome 112 ขณะนี้การตั้งค่า
document.domain
ที่จะนําออกโดยค่าเริ่มต้นถูกระงับและยังไม่ได้กําหนดเหตุการณ์สำคัญใหม่ในการจัดส่ง โปรดกลับมาดูบล็อกโพสต์นี้หรือติดตามblink-dev และชุดข้อความนี้ - 20 มกราคม 2023: ไทม์ไลน์ที่อัปเดตแล้ว - ระบบจะนำตัวตั้งค่า
document.domain
ออกโดยค่าเริ่มต้นตั้งแต่ Chrome 112 เป็นต้นไป นอกจากนี้ยังเพิ่มการกล่าวถึงนโยบายองค์กรเพื่อควบคุมลักษณะการทำงานของdocument.domain
ด้วย - 25 กรกฎาคม 2022: ไทม์ไลน์ที่อัปเดตแล้ว - ระบบจะนำตัวตั้งค่า
document.domain
ออกโดยค่าเริ่มต้นตั้งแต่ Chrome 109 เป็นต้นไป - 4 กุมภาพันธ์ 2022: อัปเดตไทม์ไลน์ใหม่ เราจะแสดงคำเตือนในแผงปัญหาที่เริ่มจาก Chrome 100 โดยนำตัวตั้งค่า
document.domain
ออกโดยค่าเริ่มต้นโดยเริ่มจาก Chrome 106
document.domain
ออกแบบมาเพื่อรับหรือตั้งค่าชื่อโฮสต์ของต้นทาง
ใน Chrome เว็บไซต์จะตั้งค่า document.domain
ไม่ได้ คุณจะต้องใช้แนวทางอื่น เช่น postMessage()
หรือ Channel Messaging API เพื่อสื่อสารข้ามแหล่งที่มา เรากำหนดเป้าหมายให้ Chrome 112 จัดส่งการเปลี่ยนแปลงนี้โดยเร็วที่สุด แต่ก็ขึ้นอยู่กับการตอบสนองต่อความตั้งใจที่จะจัดส่ง
หากเว็บไซต์ของคุณอาศัยการผ่อนปรนนโยบายต้นทางเดียวกันผ่าน document.domain
เพื่อให้ทํางานได้อย่างถูกต้อง เว็บไซต์จะต้องส่งส่วนหัว Origin-Agent-Cluster: ?0
เช่นเดียวกับเอกสารอื่นๆ ทั้งหมดที่ต้องใช้ลักษณะการทํางานดังกล่าว (โปรดทราบว่า document.domain
ไม่มีผลหากมีเพียงเอกสารเดียวที่ตั้งค่าไว้)
เหตุใดจึงทําให้ document.domain
เป็นแบบคงที่
เว็บไซต์หลายแห่งตั้งค่า document.domain
เพื่ออนุญาตให้สื่อสารระหว่างหน้าในเว็บไซต์เดียวกันแต่ต่างแหล่งที่มา
โดยทำดังนี้
สมมติว่าหน้าเว็บใน https://parent.example.com
ฝังหน้า iframe จาก https://video.example.com
หน้าเหล่านี้มี eTLD+1 (example.com
) เดียวกันแต่มีโดเมนย่อยต่างกัน เมื่อตั้งค่า document.domain
ของทั้ง 2 หน้าเป็น 'example.com'
แล้วเบราว์เซอร์จะถือว่าต้นทางทั้ง 2 รายการเป็นต้นทางเดียวกัน
ตั้งค่า document.domain
สำหรับ 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);
ตั้งค่า document.domain
สำหรับ 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);
ตอนนี้คุณสร้างการจัดการ DOM ข้ามแหล่งที่มาใน https://parent.example.com
เทียบกับ https://video.example.com
ได้แล้ว
เว็บไซต์ตั้งค่า document.domain
เพื่อให้เอกสารในเว็บไซต์เดียวกันสื่อสารกันได้ง่ายขึ้น เนื่องจากการเปลี่ยนแปลงนี้ผ่อนปรนนโยบายต้นทางเดียวกัน หน้าหลักจึงเข้าถึงเอกสารของ iframe และไปยังส่วนต่างๆ ของ DOM ได้ และในทางกลับกัน
นี่เป็นเทคนิคที่สะดวก แต่ก็ก่อให้เกิดความเสี่ยงด้านความปลอดภัย
ข้อกังวลด้านความปลอดภัยเกี่ยวกับ document.domain
ความกังวลด้านความปลอดภัยเกี่ยวกับ document.domain
ทำให้มีการปรับเปลี่ยนข้อกำหนดที่เตือนผู้ใช้ให้หลีกเลี่ยงการใช้
การพูดคุยกับผู้ให้บริการเบราว์เซอร์รายอื่นๆ ในปัจจุบันก็มุ่งไปในทิศทางเดียวกัน
ตัวอย่างเช่น เมื่อหน้าเว็บ 2 หน้าตั้งค่า document.domain
หน้าเว็บเหล่านั้นจะทําตัวราวกับว่ามาจากแหล่งที่มาเดียวกัน ซึ่งสำคัญอย่างยิ่งเมื่อหน้าเว็บเหล่านี้ใช้บริการโฮสติ้งแบบใช้ร่วมกันซึ่งมีโดเมนย่อยต่างกัน การตั้งค่า document.domain
จะเปิดการเข้าถึงเว็บไซต์อื่นๆ ทั้งหมดที่โฮสต์โดยบริการเดียวกัน ซึ่งทำให้ผู้โจมตีเข้าถึงเว็บไซต์ของคุณได้ง่ายขึ้น ซึ่งเป็นไปได้เนื่องจาก document.domain
ไม่สนใจส่วนหมายเลขพอร์ตของโดเมน
ดูข้อมูลเพิ่มเติมเกี่ยวกับผลกระทบด้านความปลอดภัยของการตั้งค่า document.domain
ได้ที่หน้า "Document.domain" ใน MDN
Chrome วางแผนที่จะทําให้ document.domain
เป็นแบบคงที่ใน Chrome 112
ฉันจะทราบได้อย่างไรว่าเว็บไซต์ของฉันได้รับผลกระทบหรือไม่
หากเว็บไซต์ได้รับผลกระทบจากการเปลี่ยนแปลงนี้ Chrome จะแจ้งเตือนในแผงปัญหาเกี่ยวกับเครื่องมือสำหรับนักพัฒนาเว็บ สังเกตธงสีเหลืองที่มุมขวาบน
หากได้ตั้งค่าปลายทางการรายงานไว้ คุณจะได้รับรายงานการเลิกใช้งานด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Reporting API กับบริการรวบรวมรายงานที่มีอยู่หรือสร้างโซลูชันของคุณเอง
คุณสามารถเรียกใช้เว็บไซต์ผ่านการตรวจสอบ API ที่เลิกใช้งานของ Lighthouse เพื่อค้นหา API ทั้งหมดที่มีกำหนดเวลาให้นําออกจาก Chrome
การสื่อสารทางเลือกข้ามต้นทาง
ปัจจุบันคุณมี 3 ตัวเลือกในการแทนที่ document.domain
สำหรับเว็บไซต์
ใช้ postMessage()
หรือ Channel Messaging API
ในกรณีการใช้งานส่วนใหญ่ document.domain
สามารถใช้แทน postMessage()
หรือ Channel Messaging API ได้
ในตัวอย่างต่อไปนี้
https://parent.example.com
ส่งคําขอhttps://video.example.com
ภายใน iframe เพื่อดําเนินการกับ DOM โดยส่งข้อความผ่านpostMessage()
https://video.example.com
จะจัดการ DOM ทันทีที่ได้รับข้อความและแจ้งให้สำเร็จกลับไปยังรายการหลักhttps://parent.example.com
ยอมรับความสําเร็จ
ในวันที่ 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
}
});
ในวันที่ 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);
});
ลองใช้ดูเพื่อดูว่าเป็นอย่างไร หากคุณมีข้อกำหนดเฉพาะที่ใช้งานร่วมกับ postMessage()
หรือ Channel Messaging API ไม่ได้ โปรดแจ้งให้เราทราบทาง Twitter ผ่าน @ChromiumDev หรือถามใน Stack Overflow ด้วยแท็ก document.domain
ทางเลือกสุดท้ายคือการส่งส่วนหัว Origin-Agent-Cluster: ?0
หากคุณมีเหตุผลที่หนักแน่นในการตั้งค่า document.domain
ต่อไป ให้ส่งส่วนหัวการตอบกลับของ Origin-Agent-Cluster: ?0
ไปพร้อมกับเอกสารเป้าหมาย
Origin-Agent-Cluster: ?0
ส่วนหัว Origin-Agent-Cluster
จะบอกเบราว์เซอร์ว่าควรจัดการเอกสารโดยคลัสเตอร์ Agent ที่ผูกกับต้นทางหรือไม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับ Origin-Agent-Cluster
ได้ที่การขอการแยกประสิทธิภาพด้วยส่วนหัว Origin-Agent-Cluster
เมื่อส่งส่วนหัวนี้ เอกสารจะยังคงตั้งค่า document.domain
ได้แม้ว่าจะกลายเป็นค่าที่ไม่เปลี่ยนแปลงโดยค่าเริ่มต้นแล้วก็ตาม
กำหนดค่า OriginAgentClusterDefaultEnabled
สำหรับนโยบายองค์กร
ผู้ดูแลระบบสามารถกําหนดค่านโยบาย OriginAgentClusterDefaultEnabled
เป็น false
เพื่อให้ตั้งค่า document.domain
เป็นค่าเริ่มต้นได้ในอินสแตนซ์ Chrome ทั่วทั้งองค์กร อ่านข้อมูลเพิ่มเติมได้ที่รายชื่อนโยบายและการจัดการ Chrome Enterprise | เอกสาร
ความเข้ากันได้กับเบราว์เซอร์
- ข้อกำหนดของ Origin ระบุว่าควรนำฟีเจอร์นี้ออก
- Mozilla พิจารณาว่าการปิดใช้
document.domain
โดยค่าเริ่มต้นเป็นการสร้างต้นแบบที่น่าลอง - WebKit ระบุว่าเห็นด้วยในระดับปานกลางเกี่ยวกับการเลิกใช้งาน
document.domain
setter
แหล่งข้อมูล
Document.domain
- API ของเว็บ | MDN- การแยกต้นทางและการเลิกใช้งาน
document.domain
- การเลิกใช้งาน
document.domain
· ปัญหา #564 · w3ctag/design-reviews
ขอขอบคุณ
รูปภาพโดย Braydon Anderson ใน Unsplash