تعرَّف على سبب الحاجة إلى حظر الوصول من نطاقات أخرى لاستخدام ميزات فعّالة، مثل 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 لقراءة بيانات البكسل، ما يجعل الحماية التي تعتمد على
"السرية" غير فعّالة.
من الأفضل أن يفحص الخادم الذي يملك المورد جميع الطلبات الواردة من مصادر مختلفة بشكل صريح. إذا لم يقدّم الخادم مالك الموارد عملية التحقّق، لن تصل البيانات أبدًا إلى مجموعة سياق التصفّح الخاصة بالجهة الضارة، وبالتالي ستظل خارج نطاق أي هجمات Spectre قد تنفّذها صفحة ويب. ونسمي هذه الحالة "حالة عزل عناوين URL التابعة للنطاق نفسه". وهذا هو بالضبط ما يدور حوله برنامج COOP+COEP.
في حالة العزل بين مصادر البيانات، يُعتبر الموقع الإلكتروني الذي يطلب البيانات أقل
خطورة، ما يتيح استخدام ميزات فعّالة مثل SharedArrayBuffer
و
performance.measureUserAgentSpecificMemory()
وموقّتات
بدرجة دقة عالية بدقة أفضل، والتي يمكن استخدامها
بخلاف ذلك في هجمات مشابهة لـ Spectre. ويمنع أيضًا تعديل
document.domain
.
سياسة مُضمِّن عناوين URL التابعة للنطاق نفسه
تمنع سياسة مُضمِّن عناوين URL التابعة للنطاق نفسه (COEP)تحميل أي مستند لأي موارد من مصادر متعددة لا تمنح الإذن صراحةً للمستند (باستخدام CORP أو CORS). باستخدام هذه الميزة، يمكنك تحديد أنّه لا يمكن لمستند تحميل هذه الموارد.
لتفعيل هذه السياسة، يجب إلحاق عنوان 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.opener
null
. بالإضافة إلى ذلك، ستعرض سمة .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.