אם האתר שלך מסתמך על הגדרת document.domain, נדרשת פעולה מצידך.
מה השתנה ולמה?
החל מגרסה Chrome 115, אתרים לא יוכלו להגדיר את document.domain
: המערכת של Chrome תהפוך את document.domain
לבלתי ניתן לשינוי. כדי לתקשר בין מקורות, צריך להשתמש בגישות חלופיות כמו postMessage()
או Channel Messages API.
לידיעתך, השינוי הזה יושק בהדרגה.
אנחנו צופים שבסופו של דבר דפדפנים אחרים נוציא משימוש את הפונקציונליות הזו ויוסרו ממנה. לפרטים, עיינו בקטע תאימות דפדפן.
למה להפוך את document.domain
לבלתי ניתן לשינוי?
document.domain
נועד לקבל או להגדיר את שם המארח של המקור. באתרים רבים ההגדרה document.domain
מאפשרת תקשורת בין דפים באותו אתר אבל ממקורות שונים.
השיטה הזו נוחה, אבל יש בה סיכון אבטחה כי היא מבטלת את אותה מדיניות מקור.
חששות בנוגע לאבטחה סביב document.domain
הובילו לשינוי במפרט שמזהיר את המשתמשים להימנע משימוש באפליקציה.
לפרט: למה להגדיר את document.domain כניתן לשינוי?
איך משתמשים היום ב-document.domain
אתרים רבים מגדירים את document.domain
כדי לאפשר תקשורת בין דפים באותו אתר אבל ממקורות שונים.
לאתרים מאותו אתר אבל לאתרים מכמה מקורות יש את אותו eTLD+1 אבל תת-דומיינים שונים.
כך נעשה שימוש ב-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.
תאימות דפדפן
- במפרט ה-HTML מצוין שיש להסיר את התכונה.
- Mozilla שוקלת להשבית את
document.domain
כברירת מחדל. כדאי ליצור אב-טיפוס. - WebKit ציין שיש להן חיוביות בינונית לגבי ההוצאה משימוש של רכיב המגדיר
document.domain
. - דיון עם ספקי דפדפנים אחרים
- whatWG / HTML בקבוצת העבודה Pull Request (בהמתנה להתנסות בניסוי)
איך אוכל לדעת אם האתר שלי מושפע?
אם האתר שלכם מושפע מהשינוי הזה, תוצג ב-Chrome אזהרה בחלונית הבעיות בכלי הפיתוח – האזהרה הזו נוספה בשנת 2022. שימו לב לסימון הצהוב בפינה השמאלית העליונה של כלי הפיתוח.
אפשר גם להריץ את האתר באמצעות ביקורת ה-API של LightHouse שהוצא משימוש כדי למצוא את כל ממשקי ה-API שמיועדים להסרה מ-Chrome.
אם הגדרתם את Reporting API, Chrome שלח לכם דוחות הוצאה משימוש כדי להודיע לכם על ההוצאה משימוש הצפויה. מידע נוסף על השימוש ב-Reporting API עם שירותים קיימים לאיסוף דוחות או באמצעות פיתוח פתרון פנימי משלכם.
איך אפשר לראות את השינוי הזה בפועל?
השינוי הזה יושק בהדרגה, החל מ-Chrome 115. כדי לראות את השינוי הזה בפעולה גם אם הוא עדיין לא הושק בדפדפן Chrome שלכם, תוכלו להפעיל אותו באופן הבא:
- פתיחה של
chrome://flags/#origin-agent-cluster-default
- בוחרים באפשרות הפעלה.
- מפעילים מחדש את Chrome.
באילו חלופות אפשר להשתמש?
האפשרות הטובה ביותר היא לא לשנות את document.domain
בכלל, לדוגמה על ידי אירוח הדף ואת כל הפריימים שמרכיבים אותו מקור. הדבר פועל
בכל הגרסאות של כל הדפדפנים. אבל לשם כך ייתכן שיהיה צורך בעיבוד מחדש משמעותי של האפליקציה, ולכן כדאי לבדוק גם חלופות שממשיכות לתמוך בגישה ממקורות שונים.
שימוש ב-postMessage()
או ב-Channel Messaging API במקום ב-document.domain
ברוב מקרי השימוש, הערך 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
גם אם היא לא ניתנת לשינוי כברירת מחדל.
כל המסמכים האחרים שדורשים התנהגות כזו יצטרכו לשלוח גם
Origin-Agent-Cluster
(שימו לב של-document.domain
אין השפעה אם רק מסמך אחד הגדיר אותו).
הגדרת OriginAgentClusterDefaultEnabled
למדיניות הארגון
האדמין יכול להגדיר את המדיניות OriginAgentClusterDefaultEnabled
ל-false
, כדי שיהיה אפשר להגדיר את document.domain
כברירת מחדל במכונות של Chrome בארגון שלכם. אפשר למצוא מידע נוסף במאמר רשימה וניהול של המדיניות בנושא Chrome Enterprise | תיעוד.
משאבים
Document.domain
– ממשקי API לאינטרנט | MDN- בידוד המקור והוצאה משימוש של
document.domain
- נוציא משימוש את
document.domain
. · גיליון #564 · w3ctag/design-reviews
אישורים
תמונה מאת Finan Akbar ב-UnFlood