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