אם האתר שלכם מסתמך על הגדרת document.domain, אתם צריכים לבצע פעולה.
מה משתנה ולמה?
החל מ-Chrome 115, אתרים לא יוכלו להגדיר את document.domain: Chrome יהפוך את document.domain לבלתי ניתן לשינוי. כדי לתקשר בין מקורות שונים, צריך להשתמש בגישות חלופיות, כמו postMessage() או Channel Messaging 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.domainsetter. - דיון עם ספקי דפדפנים אחרים
- בקשת משיכה של קבוצת העבודה של WHATWG / HTML (בהמתנה להתנסות)
איך אפשר לדעת אם האתר מושפע?
אם האתר שלכם מושפע מהשינוי הזה, Chrome יציג לכם אזהרה בחלונית Issues (בעיות) בכלי הפיתוח. האזהרה הזו נוספה בשנת 2022. שימו לב לסמל הדגל הצהוב בפינה השמאלית העליונה של כלי הפיתוח.

אפשר גם להריץ את האתר שלכם דרך ביקורת Lighthouse API שהוצא משימוש כדי למצוא את כל ממשקי ה-API שמתוכננים להסרה מ-Chrome.
אם הגדרתם את Reporting API, Chrome שלח לכם דוחות על הוצאה משימוש כדי להודיע לכם על ההוצאה משימוש הקרובה. מידע נוסף על השימוש ב-Reporting API עם שירותים קיימים לאיסוף דוחות או על בניית פתרון פנימי משלכם
איך אפשר לראות את השינוי הזה בפועל?
השינוי יושק באופן הדרגתי, החל מ-Chrome 115. כדי לראות את השינוי הזה בפעולה גם אם הוא עדיין לא הושק בדפדפן Chrome שלכם, אתם יכולים להפעיל אותו באופן הבא:
- פתיחה של
chrome://flags/#origin-agent-cluster-default - לוחצים על הפעלה.
- מפעילים מחדש את Chrome.
אילו חלופות אפשר להשתמש?
האפשרות הכי טובה היא לא לשנות את document.domain בכלל, למשל על ידי אירוח הדף וכל המסגרות שמרכיבות אותו באותו מקור. השיטה הזו פועלת בכל הגרסאות של כל הדפדפנים. אבל יכול להיות שיהיה צורך לבצע שינויים משמעותיים באפליקציה, ולכן כדאי גם לבדוק חלופות שממשיכות לתמוך בגישה בין מקורות שונים.
במקום document.domain, אפשר להשתמש ב-postMessage() או ב-Channel Messaging API
ברוב תרחישי השימוש, אפשר להשתמש ב-postMessage() או ב-Channel Messaging API במקום ב-document.domain.
בדוגמה הבאה:
-
https://parent.example.comrequestshttps://video.example.comwithin an iframe to manipulate DOM by sending a message viapostMessage(). -
https://video.example.commanipulates DOM as soon as it receives the message and notify the success back to the parent. 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- Web APIs | MDN- בידוד מקור והוצאה משימוש של
document.domain - הוצאה משימוש של
document.domain. · Issue #564 · w3ctag/design-reviews
תודות
תמונה מאת Finan Akbar ב-Unsplash