إذا كان موقعك الإلكتروني يعتمد على ضبط 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
للسماح بالتواصل بين صفحات الموقع الإلكتروني نفسه ولكن من مصادر مختلفة.
المواقع الإلكترونية التي تنتمي إلى الموقع الإلكتروني نفسه ولكنّها من مصادر مختلفة تتضمّن النطاق في المستوى الأعلى مسبوقًا باسم نفسه، ولكنّها تتضمّن نطاقات فرعية مختلفة.
في ما يلي كيفية استخدام 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.
توافُق المتصفح
- تنص مواصفات HTML على أنّه يجب إزالة الميزة.
- تعتقد Mozilla أنّ إيقاف
document.domain
تلقائيًا يستحق إنشاء نماذج أولية. - أشار فريق WebKit إلى أنّه يوافق بشكل معتدل على إيقاف
document.domain
setter نهائيًا. - المناقشة مع مورّدي المتصفّحات الآخرين
- طلب سحب من مجموعة عمل 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.com
https://video.example.com
ضمن ملف div 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