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

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

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

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

عزل المواقع الإلكترونية هي ميزة أمان في Chrome توفّر خط دفاعي إضافي لإجراء لمثل هذه الهجمات. يضمن وضع الصفحات من مواقع الويب المختلفة دائمًا إلى عمليات مختلفة، كل منها يعمل في وضع حماية يحد من الإجراءات المسموح بها للعملية. كما أنّه يمنع العملية من تلقّي أنواع معيّنة من البيانات الحسّاسة من مواقع إلكترونية أخرى. نتيجة لذلك، أُنشئت مكتبة مات بلوت ليب في نتيجة عزل الموقع، يكون من الصعب جدًا على المواقع الإلكترونية الضارة استخدام عناوين URL على القنوات الجانبية مثل 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) متعددة المصادر (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 يتم عرضهما كموارد JSON وهما text/html مع نوع JSON MIME وموارد 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 بكسل. ولكن بعد ذلك، انتقلت صفحة FluffyKittens يغير العرض إلى 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 للحفاظ على موارد البيانات الحساسة خارج عملية العرض. تضمن لك توصياتنا السابقة يمكنك الاستفادة إلى أقصى حد من ميزات الأمان الجديدة هذه

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