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

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

תאימות דפדפן

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

אם האתר שלכם מושפע מהשינוי הזה, תוצג ב-Chrome אזהרה בחלונית הבעיות בכלי הפיתוח – האזהרה הזו נוספה בשנת 2022. שימו לב לסימון הצהוב בפינה השמאלית העליונה של כלי הפיתוח.

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

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

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

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

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

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

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

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

שימוש ב-postMessage() או ב-Channel Messaging API במקום ב-document.domain

ברוב מקרי השימוש, הערך postMessage() ממקורות שונים או Channel Messaging API יכול להחליף את document.domain.

בדוגמה הבאה:

  1. האפליקציה https://parent.example.com מבקשת את https://video.example.com בתוך iframe כדי לטפל ב-DOM על ידי שליחת הודעה דרך postMessage().
  2. הקוד https://video.example.com מבצע מניפולציה על DOM ברגע שהוא מקבל את ההודעה, ומעדכן את ההורה אם הפעולה בוצעה בהצלחה.
  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 ב-UnFlood