إذا كان موقعك الإلكتروني يعتمد على ضبط document.domain، عليك اتّخاذ إجراء.
ما هي التغييرات وأسبابها؟
اعتبارًا من الإصدار 115 من Chrome، لن تتمكّن المواقع الإلكترونية من ضبط 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 وتصفّح شجرة نموذج العناصر في المستند، والعكس صحيح.
هذه التقنية مريحة، ولكنّها تنطوي على مخاطر أمنية.
مخاوف متعلّقة بالأمان بشأن 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 تحذيرًا في لوحة "المشاكل" ضمن "أدوات مطوّري البرامج". وقد تمت إضافة هذا التحذير في عام 2022. لاحِظوا العلم الأصفر في أعلى يسار "أدوات مطوّري البرامج".

يمكنك أيضًا تشغيل موقعك الإلكتروني من خلال تدقيق واجهة برمجة التطبيقات المتوقّفة نهائيًا في LightHouse للعثور على جميع واجهات برمجة التطبيقات التي سيتم إزالتها من Chrome.
إذا كنت قد أعددت Reporting API، أرسل إليك Chrome تقارير إيقاف نهائي لإعلامك بهذا الإيقاف النهائي القادم. يمكنك الاطّلاع على مزيد من المعلومات حول كيفية استخدام Reporting API مع خدمات جمع التقارير الحالية أو من خلال إنشاء حلّ داخلي خاص بك.
كيف يمكنني الاطّلاع على هذا التغيير أثناء عمله؟
سيتم طرح هذا التغيير بشكل تدريجي، بدءًا من الإصدار 115 من Chrome. للاطّلاع على هذا التغيير أثناء التنفيذ حتى إذا لم يتم طرحه بعد في متصفّح Chrome، يمكنك تفعيله باتّباع الخطوات التالية:
- فتح "
chrome://flags/#origin-agent-cluster-default" - انقر على تفعيل.
- أعِد تشغيل Chrome.
ما هي البدائل التي يمكنني استخدامها؟
الخيار الأفضل هو عدم تعديل document.domain على الإطلاق، مثلاً من خلال استضافة الصفحة وجميع إطاراتها المكوّنة على المصدر نفسه. تعمل هذه الطريقة في جميع إصدارات جميع المتصفّحات. ولكن قد يتطلّب ذلك إعادة صياغة جزء كبير من التطبيق، لذا ننصحك بالاطّلاع على البدائل التي تتيح مواصلة استخدام عمليات الوصول من مصادر متعددة.
استخدام postMessage() أو Channel Messaging API بدلاً من document.domain
في معظم حالات الاستخدام، يمكن أن يحلّ postMessage()
أو Channel Messaging API
محلّ document.domain.
في المثال التالي:
- تطلب
https://parent.example.comhttps://video.example.comضمن إطار iframe تعديل نموذج المستند (DOM) من خلال إرسال رسالة عبرpostMessage(). - تعمل السمة
https://video.example.comعلى تعديل DOM فور تلقّي الرسالة وإرسال إشعار إلى العنصر الرئيسي لإعلامه بنجاح العملية. 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- واجهات برمجة التطبيقات على الويب | MDN- عزل المصدر وإيقاف
document.domainنهائيًا - إيقاف
document.domainنهائيًا · المشكلة رقم 564 · w3ctag/design-reviews
الإقرارات
صورة من Finan Akbar على Unsplash