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

تاريخ النشر: 4 مايو 2020

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

مسرد المصطلحات

يستخدم هذا المستند العديد من المصطلحات التي تحمل أسماء متشابهة ومختصرة. للتوضيح، أعددنا مسردًا مصغّرًا للمصطلحات:

خلفية

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

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

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

وعندما أدرك منتدى الويب مزايا سياسة المصدر نفسه الصارمة، كان الويب يعتمد على هذه الاستثناءات.

تم إصلاح الآثار الجانبية الأمنية الناتجة عن سياسة المصدر نفسه المتساهلة هذه بطريقتين:

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

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

تتضمّن "مجموعة سياقات التصفّح" الموقع الإلكتروني الأساسي ومواد العرض من الموقع الإلكتروني المضمّن.

لفترة طويلة، كانت هذه المجموعة كافية للحفاظ على أمان المتصفّحات، مع حالات محدودة تحتاج إلى تصحيح مباشر (مثل ثغرات JSON).

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

إذا كان evil.com يتضمّن صورة متعدّدة المصادر، يمكن للمهاجمين استخدام هجوم Spectre لقراءة بيانات وحدات البكسل الخاصة بالصورة المضمّنة. ويؤدي ذلك إلى عدم فعالية وسائل الحماية التي تعتمد على "التعتيم".

‫Evil.com هو الموقع الإلكتروني الرئيسي الذي يهاجم إطار b.example المضمّن والصور باستخدام Spectre.

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

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

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

تمنع سياسة Cross-Origin Embedder Policy (COEP) المستند من تحميل أي موارد متعدّدة المصادر لا تمنح المستند إذنًا صريحًا باستخدام CORP أو CORS. باستخدام هذه الميزة، يمكنك الإعلان عن أنّه لا يمكن للمستند تحميل هذه الموارد.

مخطّط بياني يوضّح مواد العرض المضمَّنة المسموح بها وغير المسموح بها، وذلك بفضل سياسات CORS
ضبط الموقع الإلكتروني الرئيسي، a.example، سياسة COEP على require-corp. يريد a.example تضمين 3 مواد عرض من b.example، ولكن تم تضمين اثنتَين فقط بنجاح. يتضمّن العنصران المضمّنان الناجحان ملف JavaScript مع سياسة CORP متعددة المصادر وصورة مسموح باستخدام CORS معها. مادة العرض الثالثة هي فيديو يتضمّن سياسة CORP تتطلّب تضمين مادة العرض على المصدر نفسه فقط، وبالتالي لن يتم تحميل الفيديو على a.example.

لتفعيل هذه السياسة، أضِف عنوان HTTP التالي إلى المستند:

Cross-Origin-Embedder-Policy: require-corp

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

لكي يمكن تحميل الموارد من مصدر آخر، يجب أن تتوافق مع مشاركة الموارد المتعدّدة المصادر (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).

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

تتيح لك سياسة Cross Origin Opener Policy (COOP) عزل نافذة بمستوى أعلى عن المستندات الأخرى من خلال وضع المستندات في مجموعة سياقات تصفّح منفصلة. بهذه الطريقة، لا يمكن للمستندات التفاعل مباشرةً مع النافذة ذات المستوى الأعلى. على سبيل المثال، إذا فتح مستند يتضمّن COOP مربّع حوار، ستكون قيمة السمة window.opener هي null. قيمة السمة .closed في مرجع النافذة الأصلية هي true.

تعذّر على a.example فتح b.example في مربّع حوار.

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

Cross-Origin-Opener-Policy: same-origin

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

رسم يوضّح نافذة يمكنها التفاعل مع نافذة منبثقة &quot;من المصدر نفسه&quot; ضِمن مجموعة سياق التصفّح نفسها، ولكن ليس نافذة مصنّفة على أنّها &quot;من المصدر نفسه&quot; بينما لا تزال خارج مجموعة سياق التصفّح.

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

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

COOP

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.

الموارد