Chrome ישבית את שינוי המסמך document.domain כדי להאט את מדיניות המקור הזהה

אם ההגדרה document.domain מבוססת על האתר שלך, עליך לעשות זאת.

אייג'י קיטמורה
אייג'י קיטמורה

עדכונים

  • 30 במאי 2023: הודענו שההוצאה משימוש של מגדיר document.domain תיכנס לתוקף ב-Chrome 115.
  • 7 באפריל 2023: זיהינו בעיה לפני שהשקנו את השינוי הזה ב-Chrome 112. מאפיין המגדיר document.domain שיוסר כברירת מחדל מושעה כרגע, וציון הדרך החדש של המשלוח עוד לא נקבע. חזרו לכאן בפוסט הזה או הירשמו ל-blink-dev ולשרשור הזה.
  • 20 בינואר 2023: ציר הזמן המעודכן – רכיב המגדיר document.domain יוסר כברירת מחדל החל מגרסה 112 של Chrome. נוסף גם אזכור של המדיניות הארגונית שמאפשר לשלוט בהתנהגות של document.domain.
  • 25 ביולי 2022: ציר הזמן המעודכן – הכלי המגדיר document.domain יוסר כברירת מחדל החל מגרסה 109 של Chrome.
  • 4 בפברואר 2022: ציר הזמן עודכן – תוצג אזהרה בחלונית הבעיות החל מגרסה 100 של Chrome, ותוסר כברירת מחדל מגדיר document.domain החל מ-Chrome 106.

document.domain נועד לקבל או להגדיר את שם המארח של המקור.

ב-Chrome, אתרים לא יוכלו להגדיר את document.domain. כדי לתקשר בין מקורות שונים תצטרכו להשתמש בגישות חלופיות כמו postMessage() או Channel Messaging API. אנחנו מטרגטים את Chrome 112 כדי לשלוח את השינוי הזה בהקדם, אבל הדבר תלוי בתגובה לכוונה לשלוח.

אם האתר מסתמך על הקלה במדיניות של אותו מקור באמצעות 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 לבלתי ניתן לשינוי ב-Chrome 112.

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

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

כשמשנים את document.domain, מוצגת אזהרה בחלונית הבעיות.
לאחר שינוי של document.domain, מוצגת אזהרה בחלונית הבעיות.

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

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

תקשורת חלופית ממקורות שונים

בשלב זה יש לך שלוש אפשרויות להחליף את document.domain באתר.

שימוש ב-postMessage() או ב-Channel Messaging API

ברוב מקרי השימוש, הערך 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 גם אם היא לא ניתנת לשינוי כברירת מחדל.

הגדרת OriginAgentClusterDefaultEnabled למדיניות הארגון

האדמין יכול להגדיר את המדיניות OriginAgentClusterDefaultEnabled ל-false, כדי שיהיה אפשר להגדיר את document.domain כברירת מחדל במכונות של Chrome בארגון שלכם. אפשר למצוא מידע נוסף במאמר רשימה וניהול של המדיניות בנושא Chrome Enterprise | תיעוד.

תאימות דפדפן

משאבים

אישורים

תמונה מאת בריידון אנדרסון ב-UnFlood