يتضمّن الإصدار 67 من Chrome على أجهزة الكمبيوتر المكتبي ميزة جديدة تُعرف باسم عزل المواقع الإلكترونية ويتم تفعيلها تلقائيًا. توضّح هذه المقالة ما المقصود بميزة "عزل الموقع"، وسبب ضرورتها، وأهمية أن يكون مطوّرو الويب على دراية بها.
ما المقصود بميزة "عزل المواقع الإلكترونية"؟
إنّ الإنترنت مخصّص لمشاهدة فيديوهات القطط وإدارة محافظ العملات المشفّرة، من بين أمور أخرى،
ولكن لا تريد أن يحصل 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. يمكن لموقع إلكتروني طلب نوعَين من الموارد من خادم:
- موارد البيانات، مثل مستندات HTML أو XML أو JSON
- موارد الوسائط، مثل الصور أو 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
بكسل. بعد ذلك، تغيّر صفحة FluffyKittens
العرض إلى 456
بكسل (تنسيق التفعيل) وتُرسِل رسالة إلى التطبيق المصغّر للوسائط الاجتماعية،
الذي يتضمّن الرمز التالي:
<!-- https://social-widget.example/ -->
<script>
self.onmessage = () => {
console.log(document.documentElement.clientWidth);
};
</script>
عندما تتلقّى الأداة المصغّرة للمحتوى الاجتماعي رسالة من خلال واجهة برمجة التطبيقات postMessage
API، تسجِّل عرض
عنصر <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 إبقاء موارد البيانات الحسّاسة خارج عملية عرض المحتوى. تضمن لك اقتراحاتنا أعلاه الاستفادة إلى أقصى حد من ميزات الأمان الجديدة هذه.
نشكر أليكس موشكوك، تشارلي ريس، جيسون ميلر، ناسكو أوسكوف، فيليب والتون، شوبي بانيكير، توماس شتاينر على قراءة مسودة هذه المقالة وتقديم ملاحظاتهم.