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

تعرَّف على سبب أهمية حظر الوصول من نطاقات أخرى لتتمكّن من استخدام ميزات فعّالة، مثل 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 التي تهاجم صفحة ويب يمكن أن تنفذها. وهو ما نسميه حالة حظر الوصول من نطاقات أخرى. هذا هو بالضبط ما تعنيه COOP+COEP.

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

سياسة أداة تضمين المحتوى من مصادر متعددة

أداة التضمين متعددة المصادر تمنع السياسة (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 عليها من خلال أي موقع إلكتروني. (This تمت إضافة value إلى مواصفات CORP إلى جانب COEP).

سياسة التطبيقات المتعددة المصادر

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

COOP

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

Cross-Origin-Opener-Policy: same-origin

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

COOP

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.

الموارد