سبب حاجتك إلى استخدام ميزات فعالة مع "حصر إمكانية الوصول من مصادر خارجية"

تعرَّف على سبب الحاجة إلى حظر الوصول من نطاقات أخرى لاستخدام ميزات فعّالة، مثل SharedArrayBuffer وperformance.measureUserAgentSpecificMemory() والموقّت عالي الدقة بدقة أفضل.

مقدمة

في مقالة جعل موقعك الإلكتروني "مُعزّلاً من مصادر متعددة" باستخدام إطار عمل COOP و إطار عمل COEP، أوضحنا كيفية اعتماد حالة "مُعزّل من مصادر متعددة" باستخدام إطارَي عمل COOP وCOEP. هذه مقالة مصاحبة توضّح سبب الحاجة إلى حظر الوصول من نطاقات أخرى لتفعيل ميزات فعّالة في المتصفّح.

الخلفية

تم تصميم الويب استنادًا إلى سياسة المصدر نفسه: وهي ميزة أمان تحدّ من كيفية تفاعل المستندات والنصوص البرمجية مع الموارد من مصدر آخر. يفرض هذا المبدأ قيودًا على الطرق التي يمكن للمواقع الإلكترونية من خلالها الوصول إلى الموارد من مصادر متعددة. على سبيل المثال، يتم منع مستند من https://a.example من الوصول إلى البيانات المستضافة على https://b.example.

ومع ذلك، كانت سياسة المصادر نفسها تتضمّن بعض الاستثناءات السابقة. يمكن لأي موقع إلكتروني إجراء ما يلي:

  • تضمين إطارات iframe من مصادر متعددة
  • تضمين موارد من مصادر مختلفة، مثل الصور أو النصوص البرمجية
  • فتح نوافذ منبثقة من مصادر مختلفة باستخدام مرجع DOM

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

تمّت معالجة الآثار الجانبية الأمنية لسياسة المصدر نفسه المتساهلة هذه بطريقتين. كانت إحدى الطرق هي من خلال تقديم بروتوكول جديد يُعرف باسم مشاركة موارد المنشأ المتعدّد (CORS) والهدف منه هو التأكّد من أنّ الخادم يسمح بمشاركة مرجع مع مصدر معيّن. أما الطريقة الأخرى، فهي من خلال إزالة إمكانية وصول النصوص البرمجية مباشرةً إلى موارد تطلب مصدرًا مختلفًا مع الحفاظ على التوافق مع الإصدارات القديمة. وتُعرف هذه الموارد من مصادر مختلفة باسم الموارد "غير الشفافة". على سبيل المثال، هذا هو سبب عدم التمكّن من التلاعب بوحدات البكسل لصورة من مصدر مختلف من خلال CanvasRenderingContext2D ما لم يتم تطبيق سياسة مشاركة الموارد المتعددة المصادر (CORS) على الصورة.

يتم اتخاذ جميع قرارات السياسات هذه ضمن مجموعة سياقات التصفّح.

مجموعة سياق التصفّح

لفترة طويلة، كان الجمع بين CORS والموارد غير الشفافة كافيًا لجعل المتصفّحات آمنة. في بعض الأحيان، تم اكتشاف حالات استثنائية (مثل ثغرات JSON) وتطلّب إصلاحها، ولكن بشكل عام، كان مبدأ عدم السماح بالوصول المباشر للقراءة إلى البايتات الأوّلية لموارد مصادر متعددة

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

Spectr

من الأفضل أن يفحص الخادم الذي يملك المورد جميع الطلبات الواردة من مصادر مختلفة بشكل صريح. إذا لم يقدّم الخادم مالك الموارد عملية التحقّق، لن تصل البيانات أبدًا إلى مجموعة سياق التصفّح الخاصة بالجهة الضارة، وبالتالي ستظل خارج نطاق أي هجمات Spectre قد تنفّذها صفحة ويب. ونسمي هذه الحالة "حالة عزل عناوين URL التابعة للنطاق نفسه". وهذا هو بالضبط ما يدور حوله برنامج COOP+COEP.

في حالة العزل بين مصادر البيانات، يُعتبر الموقع الإلكتروني الذي يطلب البيانات أقل خطورة، ما يتيح استخدام ميزات فعّالة مثل SharedArrayBuffer و performance.measureUserAgentSpecificMemory() وموقّتات بدرجة دقة عالية بدقة أفضل، والتي يمكن استخدامها بخلاف ذلك في هجمات مشابهة لـ Spectre. ويمنع أيضًا تعديل document.domain.

سياسة مُضمِّن عناوين URL التابعة للنطاق نفسه

تمنع سياسة مُضمِّن عناوين URL التابعة للنطاق نفسه (COEP)تحميل أي مستند لأي موارد من مصادر متعددة لا تمنح الإذن صراحةً للمستند (باستخدام CORP أو CORS). باستخدام هذه الميزة، يمكنك تحديد أنّه لا يمكن لمستند تحميل هذه الموارد.

آلية عمل سياسة COEP

لتفعيل هذه السياسة، يجب إلحاق عنوان HTTP التالي بالمستند:

Cross-Origin-Embedder-Policy: require-corp

الكلمة الرئيسية require-corp هي القيمة الوحيدة المقبولة لسمة COEP. يفرض ذلك السياسة التي تنص على أنّه لا يمكن للمستند تحميل الموارد إلا من المصدر نفسه، أو الموارد التي تم وضع علامة عليها صراحةً على أنّها قابلة للتحميل من مصدر آخر.

لكي تكون الموارد قابلة للتحميل من مصدر آخر، يجب أن تكون متوافقة مع مشاركة الموارد المتعدّدة المصادر (CORS) أو سياسة تضمين الموارد من مصادر خارجية (CORP).

مشاركة الموارد المشتركة النطاق

إذا كان أحد الموارد المشتركة المنشأ يتيح مشاركة الموارد المتعدّدة المصادر (CORS)، يمكنك استخدام الصفة crossorigin لتحميله إلى صفحة الويب بدون أن يتم حظره من خلال سياسة COEP.

<img src="https://third-party.example.com/image.jpg" crossorigin>

على سبيل المثال، إذا تم عرض مورد الصورة هذا باستخدام عناوين CORS، استخدِم السمة crossorigin لكي يستخدم طلب جلب المورد وضع CORS. ويؤدي ذلك أيضًا إلى منع تحميل الصورة ما لم يتم ضبط عناوين CORS.

وبالمثل، يمكنك جلب بيانات من مصادر متعددة من خلال طريقة fetch()، والتي لا تتطلّب معالجة خاصة ما دام الخادم يستجيب باستخدام عناوين HTTP المناسبة.

سياسة الموارد المشتركة المصدر

تم تقديم سياسة الموارد المشتركة المنشأ (CORP) في الأصل كخيار للموافقة عليه من أجل حماية مواردك من تحميلها من مصدر آخر. في سياق مبادرة COEP، يمكن لـ CORP تحديد سياسة مالك المورد بشأن مَن يمكنه تحميل المورد.

يأخذ العنوان Cross-Origin-Resource-Policy ثلاث قيم محتملة:

Cross-Origin-Resource-Policy: same-site

لا يمكن تحميل الموارد التي تم وضع علامة same-site عليها إلا من الموقع الإلكتروني نفسه.

Cross-Origin-Resource-Policy: same-origin

لا يمكن تحميل الموارد التي تم وضع علامة same-origin عليها إلا من المصدر نفسه.

Cross-Origin-Resource-Policy: cross-origin

يمكن لأي موقع إلكتروني تحميل الموارد التي تم وضع علامة cross-origin عليها. (تمّت إضافة هذه القيمة إلى مواصفات CORP مع COEP).

السياسة المحدّدة لفتح المستندات المشتركة المصدر

تسمح لك سياسة فتح المواقع الإلكترونية من مصادر متعددة (COOP) بضمان عزل نافذة ذات مستوى أعلى عن المستندات الأخرى من خلال وضعها في مجموعة سياق تصفّح مختلفة، حتى لا يتمكّن المستند من التفاعل مباشرةً مع النافذة ذات المستوى الأعلى. على سبيل المثال، إذا كان المستند الذي يتضمّن ميزة "التعاون على الإنترنت" يفتح نافذة منبثقة، سيكون window.openernull. بالإضافة إلى ذلك، ستعرض سمة .closed الخاصة بالإشارة إلى المُفعِّل القيمة true.

سياسة مشاركة البيانات

يأخذ العنوان Cross-Origin-Opener-Policy ثلاث قيم محتملة:

Cross-Origin-Opener-Policy: same-origin

يمكن للمستندات التي تم وضع علامة same-origin عليها مشاركة سياق التصفّح المجموعة نفسها مع المستندات التي لها مصدر مماثل وتم وضع علامة same-origin عليها أيضًا بشكل صريح.

سياسة مشاركة البيانات

Cross-Origin-Opener-Policy: same-origin-allow-popups

يحتفظ المستند من المستوى الأعلى الذي يحتوي على same-origin-allow-popups بالإشارات إلى أي من النوافذ المنبثقة التي لا تضبط ميزة "التعاون مع المورّدين" أو التي تتوقف عن استخدام ميزة العزل من خلال ضبط ميزة "التعاون مع المورّدين" على القيمة unsafe-none.

سياسة مشاركة البيانات

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none هو الإعداد التلقائي ويسمح بإضافة المستند إلى مجموعة سياق التصفّح الخاصة بالمُفجِّح ما لم يكن للمُفجِّح نفسه قيمة COOP تبلغ same-origin.

ملخّص

إذا كنت تريد الوصول المضمون إلى ميزات فعّالة، مثل SharedArrayBuffer أو performance.measureUserAgentSpecificMemory() أو موقّتات بدرجة دقة عالية بدقة أفضل، ما عليك سوى تذكُّر أنّ مستندك يجب أن يستخدم كلاً من COEP بالقيمة require-corp و COOP بالقيمة same-origin. وفي حال عدم توفّر أي منهما، لن يضمن المتصفّح عزلًا كافيًا لتفعيل هذه الميزات القوية بأمان. يمكنك معرفة حالة صفحتك من خلال التحقّق مما إذا كان الإجراء self.crossOriginIsolated يعرض القيمة true.

تعرَّف على خطوات تنفيذ ذلك في مقالة جعل موقعك الإلكتروني "مُعزّلاً من مصادر متعددة" باستخدام إطارَي عمل COOP وCOEP.

الموارد