سيوقف Chrome تعديل document.domain للتخفيف من حدة سياسة المصدر نفسه.

إذا كان موقعك الإلكتروني يعتمد على الإعداد document.domain، عليك اتّخاذ إجراء.

آخر الأخبار

  • ‫30 أيار (مايو) 2023: أعلنّا أنّه سيتم إيقاف document.domain نهائيًا في الإصدار 115 من Chrome.
  • 7 نيسان (أبريل) 2023: رصدنا مشكلة قبل طرح هذا التغيير في الإصدار 112 من Chrome. تم تعليق document.domain setter التي سيتم إزالتها تلقائيًا حاليًا ولم يتم تحديد الموعد الجديد لطرح التطبيق بعد. يُرجى الرجوع إلى مشاركة المدونة هذه أو الاشتراك في blink-dev وهذه السلسلة من الرسائل.
  • 20 كانون الثاني (يناير) 2023: المخطط الزمني المعدَّل: سيتم تلقائيًا إزالةdocument.domain setter اعتبارًا من الإصدار 112 من Chrome. تمت أيضًا إضافة إشارة إلى سياسة المؤسسة للتحكّم في سلوك document.domain.
  • ‫25 تموز (يوليو) 2022: تم تعديل المخطط الزمني: ستتم إزالة معدّل document.domain تلقائيًا اعتبارًا من الإصدار 109 من Chrome.
  • ‫4 شباط (فبراير) 2022: تم تعديل المخطط الزمني الجديد. سنعرض تحذيرًا في لوحة "المشاكل" اعتبارًا من الإصدار 100 من Chrome، وسنزيل معدّل document.domain تلقائيًا اعتبارًا من الإصدار 106 من Chrome.
.

تم تصميم 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 غير قابل للتغيير في الإصدار 112 من Chrome.

كيف يمكنني معرفة ما إذا كان موقعي الإلكتروني متأثرًا؟

إذا تأثّر موقعك الإلكتروني بهذا التغيير، سيُرسل Chrome تحذيرًا في لوحة المشاكل في "أدوات مطوّري البرامج". لاحِظ العلامة الصفراء في أعلى يسار الصفحة.

عند تعديل document.domain، يظهر تحذير في لوحة الصعوبات.
عند تعديل document.domain، يظهر تحذير في لوحة "المشاكل".

إذا سبق لك إعداد نقطة نهاية لإعداد التقارير، سيتم أيضًا إرسال تقارير بشأن الإيقاف نهائيًا. مزيد من المعلومات حول كيفية استخدام Reporting API مع خدمات جمع التقارير الحالية أو من خلال إنشاء حلّ داخلي

يمكنك فحص موقعك الإلكتروني من خلال مراجعة واجهات برمجة التطبيقات المتوقّفة نهائيًا في LightHouse للعثور على جميع واجهات برمجة التطبيقات التي من المخطّط إزالتها من Chrome.

بديل للتواصل بين المواقع

في الوقت الحالي، تتوفّر لك ثلاثة خيارات لاستبدال document.domain لموقعك الإلكتروني.

استخدام postMessage() أو Channel Messaging API

في معظم حالات الاستخدام، يمكن استبدال document.domain باستخدام postMessage() أو Channel Messaging API لإرسال الرسائل بين التطبيقات التي لها مصادر مختلفة.

في المثال التالي:

  1. يطلب https://parent.example.com https://video.example.com ضمن ملف div 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 وإدارتها | المستندات.

توافُق المتصفح

الموارد

الشكر والتقدير

صورة برادون أندرسون على Unsplash