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