Chrome משבית את האפשרות לשנות את document.domain

אם האתר שלכם מסתמך על הגדרת 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.

תאימות דפדפן

איך אפשר לדעת אם האתר מושפע?

אם האתר שלכם מושפע מהשינוי הזה, Chrome יציג לכם אזהרה בחלונית Issues (בעיות) בכלי הפיתוח. האזהרה הזו נוספה בשנת 2022. שימו לב לסמל הדגל הצהוב בפינה השמאלית העליונה של כלי הפיתוח.

צילום מסך של אזהרת הבעיה בכלי הפיתוח

אפשר גם להריץ את האתר שלכם דרך ביקורת Lighthouse API שהוצא משימוש כדי למצוא את כל ממשקי ה-API שמתוכננים להסרה מ-Chrome.

אם הגדרתם את Reporting API, ‏ Chrome שלח לכם דוחות על הוצאה משימוש כדי להודיע לכם על ההוצאה משימוש הקרובה. מידע נוסף על השימוש ב-Reporting API עם שירותים קיימים לאיסוף דוחות או על בניית פתרון פנימי משלכם

איך אפשר לראות את השינוי הזה בפועל?

השינוי יושק באופן הדרגתי, החל מ-Chrome 115. כדי לראות את השינוי הזה בפעולה גם אם הוא עדיין לא הושק בדפדפן Chrome שלכם, אתם יכולים להפעיל אותו באופן הבא:

  1. פתיחה של chrome://flags/#origin-agent-cluster-default
  2. לוחצים על הפעלה.
  3. מפעילים מחדש את Chrome.

אילו חלופות אפשר להשתמש?

האפשרות הכי טובה היא לא לשנות את document.domain בכלל, למשל על ידי אירוח הדף וכל המסגרות שמרכיבות אותו באותו מקור. השיטה הזו פועלת בכל הגרסאות של כל הדפדפנים. אבל יכול להיות שיהיה צורך לבצע שינויים משמעותיים באפליקציה, ולכן כדאי גם לבדוק חלופות שממשיכות לתמוך בגישה בין מקורות שונים.

במקום document.domain, אפשר להשתמש ב-postMessage() או ב-Channel Messaging API

ברוב תרחישי השימוש, אפשר להשתמש ב-postMessage() או ב-Channel Messaging API במקום ב-document.domain.

בדוגמה הבאה:

  1. https://parent.example.com requests https://video.example.com within an iframe to manipulate DOM by sending a message via postMessage().
  2. https://video.example.com manipulates DOM as soon as it receives the message and notify the success back to the parent.
  3. 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 וניהול | מאמרי עזרה.

משאבים

תודות

תמונה מאת Finan Akbar ב-Unsplash