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