يوقف Chrome تعديل document.domain.

إذا كان موقعك الإلكتروني يعتمد على ضبط 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.

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

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

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

لقطة شاشة للتحذير من حدوث المشكلة في "أدوات مطوري البرامج"

يمكنك أيضًا تشغيل موقعك الإلكتروني من خلال تدقيق واجهة برمجة التطبيقات الذي تم إيقافه نهائيًا لـ LightHouse للعثور على جميع واجهات برمجة التطبيقات التي تمّت جدولة إزالتها من Chrome.

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

كيف أرى هذا التغيير عمليًا؟

سيتم طرح التغيير تدريجيًا بدءًا من Chrome 115. للاطِّلاع على هذا التغيير عمليًا حتى إذا لم يكن قد تم طرحه من قبل في متصفِّح Chrome، يمكنك تفعيله كما يلي:

  1. فتح "chrome://flags/#origin-agent-cluster-default"
  2. اختَر تفعيل.
  3. أعِد تشغيل متصفِّح Chrome.

ما هي البدائل التي يمكنني استخدامها؟

وأفضل خيار هو عدم تعديل document.domain على الإطلاق، مثلاً من خلال استضافة الصفحة وجميع الإطارات الأساسية على المصدر نفسه. يعمل هذا في جميع إصدارات جميع المتصفحات. وقد يتطلّب ذلك إعادة عمل كبيرة على أحد التطبيقات، لذا من المفيد أيضًا البحث عن البدائل التي تواصل إتاحة الوصول من مصادر متعددة.

يمكنك استخدام postMessage() أو Channel Messaging API بدلاً من document.domain.

في معظم حالات الاستخدام، يمكن أن تحلّ 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 حتى بعد أن يصبح غير قابل للتغيير تلقائيًا.

وعلى جميع المستندات الأخرى التي تتطلّب هذا السلوك أيضًا إرسال Origin-Agent-Cluster (يُرجى العلم أنّه ليس لـ document.domain أي تأثير إذا تم ضبطه على مستند واحد فقط).

ضبط OriginAgentClusterDefaultEnabled لسياسة المؤسسة

اختياريًا، يمكن للمشرف ضبط سياسة OriginAgentClusterDefaultEnabled على false لضبط document.domain تلقائيًا على نُسخ Chrome في مؤسستك. لمزيد من المعلومات، يُرجى الاطّلاع على قائمة سياسات Chrome Enterprise وإدارتها | المستندات.

المراجِع

شكر وتقدير

صورة فينان أكبر على قناة Unsplash