عزل الموقع لمطوري الويب

يتضمّن Chrome 67 على الكمبيوتر المكتبي ميزة جديدة تُسمى عزل الموقع مفعَّلة تلقائيًا. توضح هذه المقالة ما يعنيه عزل الموقع، وسبب أهميته، ولماذا يجب أن يكون مطورو الويب على دراية به.

ما المقصود بعزل الموقع؟

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

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

يؤدي استخدام ميزة "عزل المواقع الإلكترونية" إلى صعوبة في الوصول إلى المعلومات غير الموثوق بها أو سرقتها من حساباتك على المواقع الإلكترونية الأخرى بشكل فعّال. وتوفّر هذه الميزة حماية إضافية ضد أنواع مختلفة من أخطاء الأمان، مثل هجمات Meltdown وSpectre الأخيرة على القنوات الجانبية.

للحصول على مزيد من التفاصيل حول عزل الموقع، يمكنك الاطلاع على مقالتنا حول مدونة أمان Google.

حظر القراءة من مصادر متعددة

حتى عندما يتم تنفيذ عمليات منفصلة على جميع الصفحات المنشورة على مواقع إلكترونية متعددة، يظل بإمكان الصفحات طلب بعض الموارد الفرعية للمواقع الإلكترونية بشكل مشروع، مثل الصور وJavaScript. يمكن أن تستخدم صفحة ويب ضارة عنصر <img> لتحميل ملف JSON يحتوي على بيانات حساسة، مثل رصيدك المصرفي:

<img src="https://your-bank.example/balance.json" />
<!-- Note: the attacker refused to add an `alt` attribute, for extra evil points. -->

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

بدلاً من استخدام <img>، يمكن للمهاجم أيضًا استخدام <script> لتخصيص البيانات الحساسة للذاكرة:

<script src="https://your-bank.example/balance.json"></script>

هجوم حظر القراءة من مصادر متعددة، أو CORB، هي ميزة أمان جديدة تمنع محتوى balance.json من الدخول مطلقًا إلى ذاكرة معالجة العارض استنادًا إلى نوع MIME الخاص بها.

دعنا نحلل آلية عمل CORB. يمكن للموقع الإلكتروني أن يطلب نوعَين من الموارد من خادم:

  1. موارد البيانات مثل مستندات HTML أو XML أو JSON
  2. موارد الوسائط مثل الصور أو JavaScript أو CSS أو الخطوط

يمكن للموقع الإلكتروني تلقّي موارد البيانات من مصدره الخاص أو من مصادر أخرى ذات عناوين CORS المسموح بها، مثل Access-Control-Allow-Origin: *. ومن ناحية أخرى، يمكن تضمين موارد الوسائط من أي مصدر، حتى بدون عناوين CORS المتساهِلة.

يمنع CORB عملية العرض من تلقّي مورد بيانات من مصادر متعددة (أي HTML أو XML أو JSON) في الحالات التالية:

  • يحتوي المورد على عنوان X-Content-Type-Options: nosniff.
  • لا تسمح سياسة CORS بالوصول صراحةً إلى المورد.

إذا لم يتم ضبط عنوان X-Content-Type-Options: nosniff في مورد البيانات من مصادر متعددة، يحاول CORB استنتاج نص الاستجابة لتحديد ما إذا كان بتنسيق HTML أو XML أو JSON. هذا الإجراء ضروري لأنّ بعض خوادم الويب قد تم ضبطها بشكل غير صحيح وتعرض الصور على أنّها text/html على سبيل المثال.

تتم معالجة موارد البيانات التي تم حظرها بموجب سياسة CORB للعملية على أنّها فارغة، على الرغم من أنّ الطلب لا يزال يحدث في الخلفية. ونتيجة لذلك، تواجه صفحة ويب ضارة صعوبة في سحب البيانات من مواقع إلكترونية متعددة إلى عمليتها لسرقة البيانات.

للحصول على أفضل مستوى من الأمان والاستفادة من CORB، ننصح بما يلي:

  • ضَع علامة على الردود باستخدام عنوان Content-Type الصحيح. (على سبيل المثال، يجب عرض موارد HTML مثل text/html وموارد JSON من نوع MIME بتنسيق JSON وموارد XML بنوع MIME بتنسيق XML).
  • يمكنك إيقاف الالتقاط باستخدام عنوان X-Content-Type-Options: nosniff. بدون هذا العنوان، يُجري Chrome تحليلاً سريعًا للمحتوى لمحاولة التأكد من صحة النوع، ولكن نظرًا لأن هذا يحدث من جانب السماح بالردود لتجنب حظر أشياء مثل ملفات JavaScript، من الأفضل إجراء الشيء الصحيح بنفسك بشكلٍ إيجابي.

للاطّلاع على مزيد من التفاصيل، يُرجى مراجعة مقالة CORB لمطوّري البرامج على الويب أو الشرح التفصيلي لـ CORB.

لماذا يجب أن يهتم مطوِّرو برامج الويب بعزل الموقع؟

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

مع ذلك، هناك بعض الاستثناءات لهذه القاعدة. يأتي تفعيل ميزة "عزل الموقع" ببعض الآثار الجانبية الطفيفة التي قد تؤثر في موقعك الإلكتروني. نحتفظ بقائمة بمشاكل عزل الموقع المعروفة، ونفصّلنا أهمّها أدناه.

لم يعُد تنسيق الصفحة الكاملة متزامنًا

باستخدام ميزة عزل الموقع، لم يعد تخطيط الصفحة الكاملة متزامنًا، نظرًا لأن إطارات الصفحة قد تنتشر الآن عبر عمليات متعددة. قد يؤثر هذا على الصفحات إذا كانت افترضت أن تغيير التخطيط ينتشر على الفور على جميع الإطارات في الصفحة.

على سبيل المثال، لنفترض أنّ موقعًا إلكترونيًا اسمه fluffykittens.example يتواصل باستخدام أداة اجتماعية مستضافة على social-widget.example:

<!-- https://fluffykittens.example/ -->
<iframe src="https://social-widget.example/" width="123"></iframe>
<script>
  const iframe = document.querySelector('iframe');
  iframe.width = 456;
  iframe.contentWindow.postMessage(
    // The message to send:
    'Meow!',
    // The target origin:
    'https://social-widget.example'
  );
</script>

في البداية، يبلغ عرض أداة الشبكات الاجتماعية <iframe> 123 بكسل. ولكن بعد ذلك، تُغيّر صفحة FluffyKitters العرض إلى 456 بكسل (تنسيق التشغيل) وترسل رسالة إلى التطبيق المصغّر الاجتماعي، التي تحتوي على الرمز التالي:

<!-- https://social-widget.example/ -->
<script>
  self.onmessage = () => {
    console.log(document.documentElement.clientWidth);
  };
</script>

عندما تتلقّى الأداة الاجتماعية رسالة من خلال واجهة برمجة التطبيقات postMessage، فإنها تسجِّل عرض عنصر <html> الجذري الخاص بها.

فما هي قيمة العرض التي يتم تسجيلها؟ قبل تفعيل ميزة "عزل المواقع الإلكترونية" في Chrome، كانت الإجابة هي 456. يؤدي الوصول إلى "document.documentElement.clientWidth" إلى فرض التنسيق الذي كان في السابق متزامنًا قبل "عزل المواقع الإلكترونية" الذي فعّل Chrome. ومع ذلك، مع تفعيل "عزل الموقع"، تتم الآن إعادة تخطيط الأداة الاجتماعية متعددة المصادر بشكل غير متزامن في عملية منفصلة. وبالتالي، يمكن أن تكون الإجابة الآن أيضًا 123، أي قيمة width القديمة.

إذا غيّرت إحدى الصفحات حجم <iframe> من مصادر متعددة، ثم أرسلت postMessage إليها، من خلال "عزل الموقع"، قد لا يعرف إطار الاستلام حجمه الجديد عند تلقّي الرسالة. وبشكل عام، قد يؤدي هذا إلى تقسيم الصفحات إذا افترضت أن تغيير التصميم ينتشر على الفور في جميع الإطارات في الصفحة.

في هذا المثال تحديدًا، قد يؤدّي استخدام حلّ أكثر فعالية إلى ضبط width في الإطار الرئيسي، ورصد هذا التغيير في <iframe> من خلال رصد حدث resize.

قد تنتهي مهلة معالِجات إلغاء التحميل بشكل متكرّر.

عند انتقال إطار أو إغلاقه، يتم تشغيل معالج unload على المستند القديم وأي مستندات الإطارات الفرعية المضمَّنة فيه. وإذا حدث التنقّل الجديد في عملية العارض نفسها (على سبيل المثال، بالنسبة إلى التنقّل من المصدر نفسه)، يمكن تشغيل معالِجات unload للمستند القديم وإطاراته الفرعية لفترة طويلة بشكل عشوائي قبل السماح بتنفيذ عملية التنقّل الجديدة.

addEventListener('unload', () => {
  doSomethingThatMightTakeALongTime();
});

في هذه الحالة، تكون معالِجات unload في جميع الإطارات موثوقة للغاية.

ومع ذلك، حتى بدون ميزة "عزل الموقع"، تكون بعض عمليات التنقّل في الإطار الرئيسي بين العمليات، ما يؤثر في سلوك معالج إلغاء التحميل. على سبيل المثال، عند الانتقال من old.example إلى new.example عن طريق كتابة عنوان URL في شريط العناوين، سيتم تنفيذ عملية التنقّل new.example في إطار عملية جديدة. إنّ معالِجات إلغاء التحميل في old.example وإطاراته الفرعية تعمل أثناء عملية old.example في الخلفية بعد عرض صفحة new.example، ويتم إنهاء معالِجات إلغاء التحميل القديمة إذا لم تنتهِ خلال مهلة معيّنة. ولأنّ معالِجات إلغاء التحميل قد لا تنتهي قبل انقضاء المهلة، يكون سلوك إلغاء التحميل أقل موثوقية.

من خلال ميزة "عزل الموقع"، تصبح جميع عمليات التنقل بين المواقع الإلكترونية عمليات متقاطعة، بحيث لا تشارك المستندات من المواقع الإلكترونية المختلفة العملية مع بعضها البعض. نتيجةً لذلك، ينطبق الموقف أعلاه في المزيد من الحالات، وغالبًا ما تتضمّن معالِجات إلغاء التحميل في <iframe> سلوكيات الخلفية والمهلة الموضّحة أعلاه.

وهناك اختلاف آخر ناجم عن عزل الموقع وهو الترتيب المتوازي الجديد لمعالِجات إلغاء التحميل: فبدون عزل الموقع، يتم تشغيل معالِجات إلغاء التحميل بترتيب صارم من أعلى إلى أسفل عبر الإطارات. ولكن باستخدام ميزة "عزل الموقع"، يتم تشغيل معالِجات إلغاء التحميل بالتوازي عبر عمليات مختلفة.

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

من الحالات المهمة لمعالِجات إلغاء التحميل إرسال إشعارات بنهاية الجلسة. يتم ذلك عادةً على النحو التالي:

addEventListener('pagehide', () => {
  const image = new Image();
  img.src = '/end-of-session';
});

في ضوء هذا التغيير، يمكنك استخدام navigator.sendBeacon بدلاً من ذلك:

addEventListener('pagehide', () => {
  navigator.sendBeacon('/end-of-session');
});

إذا كنت بحاجة إلى مزيد من التحكّم في الطلب، يمكنك استخدام خيار keepalive في Fetch API:

addEventListener('pagehide', () => {
  fetch('/end-of-session', {keepalive: true});
});

الخلاصة

تؤدي ميزة عزل الموقع إلى صعوبة وصول المواقع الإلكترونية غير الموثوق بها إلى المعلومات أو سرقتها من حساباتك على المواقع الإلكترونية الأخرى، وذلك من خلال عزل كل موقع إلكتروني في عملياته الخاصة. كجزء من ذلك، تحاول CORB منع موارد البيانات الحساسة من عملية العارض. تضمن اقتراحاتنا أعلاه الاستفادة إلى أقصى حد من ميزات الأمان الجديدة هذه.

شكرًا على "أليكس موششوك"، و"تشارلي ريس"، و"جايسون ميلر"، و"ناسكو أوسكوف"، وفيليب والتون، و"شوبي بانيكر"، و "توماس شتاينر" لقراءة مسودة لنسخة من هذه المقالة وتقديم ملاحظاتها.