تحديثات SharedArrayBuffer في الإصدار 88 من متصفّح Chrome على نظام التشغيل Android والإصدار 92 من متصفّح Chrome لأجهزة الكمبيوتر المكتبي

من العادل أن نقول إنّ SharedArrayBuffer واجه بعض المشاكل على الويب، إلا أنّ الأمور لم تكتمل بعد. وفي ما يلي ما تحتاج إلى معرفته:

باختصار

  • يتوفّر SharedArrayBuffer حاليًا في متصفّح Firefox 79 وما فوق، وسيتوفّر على نظام التشغيل Android Chrome 88. ومع ذلك، لا تتوفّر هذه الميزة إلا للصفحات التي تم عزلها من مصادر متعددة.
  • تتوفّر علامة التبويب SharedArrayBuffer حاليًا في متصفّح Chrome لأجهزة الكمبيوتر المكتبي، ولكن في الإصدار 92 من Chrome، ستقتصر على الصفحات المعزولة من مصادر متعددة. إذا كنت لا تعتقد أنّه يمكنك إجراء هذا التغيير في الوقت المناسب، يمكنك التسجيل في مرحلة التجربة والتقييم للاحتفاظ بالسلوك الحالي حتى الإصدار Chrome 113 على الأقل.
  • إذا كنت تنوي تفعيل ميزة العزل المشترك المصدر لمواصلة استخدام ميزة SharedArrayBuffer، عليك تقييم تأثير ذلك في العناصر الأخرى المشتركة المصدر على موقعك الإلكتروني، مثل مواضع الإعلانات. تحقَّق مما إذا تم استخدام SharedArrayBuffer من خلال أي من مواردك التابعة لجهات خارجية لفهم التأثير والإرشادات.

نظرة عامة على حظر الوصول من نطاقات أخرى

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

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

بعد إجراء ذلك، لن تتمكّن صفحتك من تحميل محتوى من مصادر متعددة إلا إذا كان المورد يسمح بذلك بشكل صريح من خلال عنوان Cross-Origin-Resource-Policy أو عناوين CORS(Access-Control-Allow-* وما إلى ذلك).

تتوفر أيضًا واجهة برمجة تطبيقات لإعداد التقارير، ما يتيح لك جمع البيانات عن الطلبات التي تعذّر تنفيذها نتيجة Cross-Origin-Embedder-Policy وCross-Origin-Opener-Policy.

إذا كنت لا تعتقد أنّه يمكنك إجراء هذه التغييرات في الوقت المناسب للإصدار 92 من Chrome، يمكنك التسجيل في مرحلة التجربة والتقييم للاحتفاظ بسلوك Chrome الحالي الخاص بأجهزة الكمبيوتر المكتبي حتى إصدار Chrome 113 على الأقل.

راجِع قسم قراءة المزيد في أسفل هذه الصفحة للحصول على مزيد من الإرشادات والمعلومات حول حظر الوصول من نطاقات أخرى.

كيف وصلنا إلى هنا؟

وصل SharedArrayBuffer إلى Chrome 60 (في تموز (يوليو) 2017، لهؤلاء الذين يفكرون في الوقت في التواريخ بدلاً من إصدارات Chrome)، وكان كل شيء على ما يرام. لمدة 6 أشهر.

في يناير 2018، تم الكشف عن ثغرة أمنية في بعض وحدات المعالجة المركزية (CPU) الشائعة. يمكنك الاطّلاع على الإشعار لمعرفة التفاصيل الكاملة، ولكنه يعني في الأساس أنّ الرمز البرمجي يمكن أن يستخدم مؤقتات عالية الدقة لقراءة ذاكرة لا يُفترض أن يصل إليها.

كانت هذه مشكلة بالنسبة إلينا كمورّدي المتصفِّح، لأننا نريد السماح للمواقع الإلكترونية بتنفيذ تعليمات برمجية في شكل JavaScript وWASM، ولكننا نتحكّم بشكل صارم في الذاكرة التي يمكن لهذا الرمز الوصول إليها. إذا وصلت إلى موقعي الإلكتروني، لن أتمكّن من قراءة أي معلومات من موقع الخدمات المصرفية على الإنترنت الذي تستخدمه أيضًا. في الواقع، لا يجب أن أعرف حتى أن لديك موقع خدمات مصرفية على الإنترنت مفتوحًا. هذه هي أساسيات أمان الويب.

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

يتمثل التخفيف العام في التأكد من أن عملية نظام صفحة الويب لا تحتوي على بيانات حساسة من مكان آخر. استثمر Chrome في بنية متعددة العمليات منذ البداية (هل تتذكر القصة المصوّرة؟)، ولكن لا تزال هناك حالات يمكن أن تنتهي فيها البيانات من مواقع متعددة في العملية نفسها:

<iframe src="https://your-bank.example/balance.json"></iframe>
<script src="https://your-bank.example/balance.json"></script>
<link rel="stylesheet" href="https://your-bank.example/balance.json" />
<img src="https://your-bank.example/balance.json" />
<video src="https://your-bank.example/balance.json"></video>
<!-- …and more… -->

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

لقد تعاملنا مع واجهات برمجة التطبيقات القديمة هذه من خلال منع المحتوى من الدخول إلى إجراءات صفحة الويب إذا بدا "غير صحيح"، وأطلقنا عليه اسم حظر القراءة من مصادر متعددة. وبالتالي، في الحالات المذكورة أعلاه، لن نسمح لJSON بالدخول إلى العملية، لأنها ليست تنسيقًا صالحًا لأي من واجهات برمجة التطبيقات تلك. أي، باستثناء إطارات iframe. بالنسبة لإطارات iframe، نضع المحتوى في عملية مختلفة.

ومع تطبيق إجراءات التخفيف هذه، أعدنا طرح SharedArrayBuffer في Chrome 68 (تموز (يوليو) 2018)، ولكن على أجهزة الكمبيوتر المكتبي فقط. تعني متطلبات العملية الإضافية أننا لا يمكننا فعل الشيء ذاته على الأجهزة المحمولة. تمت ملاحظة أنّ حل Chrome لم يكن مكتملاً، لأننا كنا نحظر تنسيقات البيانات "غير الصحيحة"، في حين أنه من الممكن (على الرغم من أنّ هذا الحل غير اعتيادي) أن تحتوي عناوين URL التي يمكن تخمينها/CSS/الصور الصالحة على بيانات خاصة.

اجتمع الأشخاص على الويب للتوصل إلى حل أكثر اكتمالاً عبر المتصفحات. كان الحل هو منح الصفحات طريقة لقول "بموجب هذه الرسالة، أتخلى عن قدرتي على إضافة محتوى من مصادر أخرى إلى هذه العملية بدون موافقة المستخدم". يتم إصدار هذا البيان من خلال عناوين COOP وCOEP التي يتم عرضها مع الصفحة. ويفرض المتصفّح ذلك، وفي المقابل، تحصل الصفحة على إمكانية الوصول إلى SharedArrayBuffer وواجهات برمجة التطبيقات الأخرى التي تتمتع بإمكانات مشابهة. ويمكن للمصادر الأخرى تفعيل ميزة تضمين المحتوى من خلال Cross-Origin-Resource-Policy أو CORS.

وكانت Chrome أول من يشحن SharedArrayBuffer بموجب هذا القيد، وذلك في الإصدار 79 (تموز/يوليو 2020).

بعد ذلك، في كانون الثاني (يناير) 2021، كتبت هذه المقالة، وقرأتها. مرحبًا،

وهذا هو المكان الذي نحن فيه الآن. يعيد Chrome 88 استخدام SharedArrayBuffer إلى Android للصفحات التي يتم عزلها من مصادر متعددة، ويضيف Chrome 92 المتطلبات نفسها إلى الكمبيوتر المكتبي، وذلك لتحقيق الاتساق وتحقيق عزل متعدد المصادر.

تأخير تغيير إصدار Chrome الخاص بأجهزة الكمبيوتر المكتبي

وهذا استثناء مؤقت في شكل "تجربة المصدر" التي تمنح الأشخاص مزيدًا من الوقت لتنفيذ الصفحات المعزولة من مصادر متعددة. وتفعِّل هذه السياسة SharedArrayBuffer بدون طلب حظر الوصول من مصادر متعددة في الصفحة. تنتهي صلاحية الاستثناء في الإصدار 113 من Chrome، وينطبق الاستثناء فقط على متصفِّح Chrome لأجهزة الكمبيوتر المكتبي.

  1. اطلب رمزًا مميّزًا لنقطة الانطلاق.
  2. أضِف الرمز المميّز إلى صفحاتك. تتوفّر طريقتان لتنفيذ هذا الإجراء:
    • أضِف العلامة <meta> لبرامج origin-trial إلى عنوان كل صفحة. على سبيل المثال، قد يبدو العنوان التالي:
      <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • إذا كان بإمكانك ضبط الخادم، يمكنك أيضًا إضافة الرمز المميّز باستخدام عنوان HTTP يتضمّن Origin-Trial. من المفترض أن يبدو عنوان الاستجابة الناتج على النحو التالي:
      Origin-Trial: TOKEN_GOES_HERE

محتوى إضافي للقراءة

صورة بانر من إعداد دانيال غريغوار على UnLaunch