אם ההגדרה document.domain
מבוססת על האתר שלך, עליך לעשות זאת.
עדכונים
- 30 במאי 2023: הודענו שההוצאה משימוש של מגדיר
document.domain
תיכנס לתוקף ב-Chrome 115. - 7 באפריל 2023: זיהינו בעיה לפני שהשקנו את השינוי הזה ב-Chrome 112. מאפיין המגדיר
document.domain
שיוסר כברירת מחדל מושעה כרגע, וציון הדרך החדש של המשלוח עוד לא נקבע. חזרו לכאן בפוסט הזה או הירשמו ל-blink-dev ולשרשור הזה. - 20 בינואר 2023: ציר הזמן המעודכן – רכיב המגדיר
document.domain
יוסר כברירת מחדל החל מגרסה 112 של Chrome. נוסף גם אזכור של המדיניות הארגונית שמאפשר לשלוט בהתנהגות שלdocument.domain
. - 25 ביולי 2022: ציר הזמן המעודכן – הכלי המגדיר
document.domain
יוסר כברירת מחדל החל מגרסה 109 של Chrome. - 4 בפברואר 2022: ציר הזמן עודכן – תוצג אזהרה בחלונית הבעיות החל מגרסה 100 של Chrome, ותוסר כברירת מחדל מגדיר
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
של שני הדפים מוגדר
ל-'example.com'
, הדפדפן מתייחס לשני המקורות כאילו הם אותו מקור.
מגדירים את 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
הובילו לשינוי במפרט שמזהיר את המשתמשים להימנע משימוש בו.
הדיון הנוכחי עם ספקי דפדפנים אחרים נע באותו כיוון.
לדוגמה, כששני דפים מגדירים את document.domain
, הם יכולים להתחזות לאותו מקור. זה קריטי במיוחד אם בדפים האלה נעשה שימוש בשירות אירוח משותף עם תת-דומיינים שונים. ההגדרה של document.domain
פותחת
גישה לכל האתרים האחרים שמתארחים באותו השירות, וכך
לתוקפים קל יותר לגשת לאתרים שלך. זה יכול לקרות כי document.domain
מתעלם מהחלק של מספר היציאה בדומיין.
למידע נוסף על השלכות האבטחה של הגדרת document.domain
, קראו את הדף"Document.domain" ב-MDN.
ב-Chrome מתכננים להפוך את document.domain
לבלתי ניתן לשינוי ב-Chrome 112.
איך אוכל לדעת אם האתר שלי מושפע?
אם האתר שלכם מושפע מהשינוי הזה, תוצג ב-Chrome אזהרה בחלונית 'בעיות בכלי הפיתוח'. שימו לב לסמן הצהוב בפינה הימנית העליונה.
אם הגדרתם נקודת קצה לדיווח, יישלחו לכם גם דוחות על הוצאה משימוש. מידע נוסף על השימוש ב-Reporting API עם שירותים קיימים לאיסוף דוחות או באמצעות פיתוח פתרון פנימי משלכם.
כדי לאתר את כל ממשקי ה-API שמיועדים להסרה מ-Chrome, תוכלו להריץ את האתר באמצעות בדיקת ה-API של LightHouse שהוצא משימוש.
תקשורת חלופית ממקורות שונים
בשלב זה יש לך שלוש אפשרויות להחליף את document.domain
באתר.
שימוש ב-postMessage()
או ב-Channel Messaging API
ברוב מקרי השימוש, הערך postMessage()
ממקורות שונים או Channel Messaging API יכול להחליף את document.domain
.
בדוגמה הבאה:
- האפליקציה
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
מורה לדפדפן אם צריך לטפל במסמך
באמצעות אשכול הסוכנים המשויכים למקור, או לא. למידע נוסף על Origin-Agent-Cluster
, קראו את המאמר בקשה לבידוד ביצועים באמצעות הכותרת Origin-Agent-Cluster
.
כששולחים את הכותרת הזו, המסמך יכול להמשיך להגדיר את document.domain
גם אם היא לא ניתנת לשינוי כברירת מחדל.
הגדרת OriginAgentClusterDefaultEnabled
למדיניות הארגון
האדמין יכול להגדיר את המדיניות OriginAgentClusterDefaultEnabled
ל-false
, כדי שיהיה אפשר להגדיר את document.domain
כברירת מחדל במכונות של Chrome בארגון שלכם. אפשר למצוא מידע נוסף במאמר רשימה וניהול של המדיניות בנושא Chrome Enterprise | תיעוד.
תאימות דפדפן
- במפרט של מקור מציינים שצריך להסיר את התכונה.
- Mozilla שוקלת להשבית את
document.domain
כברירת מחדל. כדאי ליצור אב-טיפוס. - WebKit ציין שיש להן חיוביות בינונית לגבי ההוצאה משימוש של רכיב המגדיר
document.domain
.
משאבים
Document.domain
– ממשקי API לאינטרנט | MDN- בידוד המקור והוצאה משימוש של
document.domain
- נוציא משימוש את
document.domain
. · גיליון #564 · w3ctag/design-reviews
אישורים
תמונה מאת בריידון אנדרסון ב-UnFlood