به‌روزرسانی‌های SharedArrayBuffer در Android Chrome 88 و Desktop Chrome 92

منصفانه است که بگوییم SharedArrayBuffer کمی در وب فرود آمد، اما همه چیز در حال حل شدن است. در اینجا چیزی است که شما باید بدانید:

به طور خلاصه

  • SharedArrayBuffer در حال حاضر در فایرفاکس نسخه 79 و بالاتر پشتیبانی می‌شود و در اندروید کروم 88 ارائه می‌شود. با این حال، فقط برای صفحاتی در دسترس است که از هم جدا شده‌اند .
  • SharedArrayBuffer در حال حاضر در کروم دسکتاپ در دسترس است، اما از Chrome 92 به صفحات جدا شده با منشاء متقابل محدود می شود. اگر فکر نمی‌کنید بتوانید این تغییر را به موقع انجام دهید، می‌توانید برای یک آزمایش اولیه ثبت نام کنید تا حداقل تا Chrome 113 رفتار فعلی را حفظ کنید.
  • اگر قصد دارید برای ادامه استفاده از SharedArrayBuffer جداسازی متقاطع را فعال کنید، تأثیری که این کار بر سایر عناصر متقاطع در وب‌سایت شما خواهد داشت، مانند مکان‌های تبلیغات، ارزیابی کنید. بررسی کنید که آیا SharedArrayBuffer توسط هر یک از منابع شخص ثالث شما برای درک تأثیر و راهنمایی استفاده می شود یا خیر.

بررسی اجمالی جداسازی مبدا متقابل

می‌توانید با ارائه صفحه با این سرصفحه‌ها، یک منبع متقاطع صفحه ایجاد کنید:

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

هنگامی که این کار را انجام دادید، صفحه شما نمی‌تواند محتوای متقاطع را بارگیری کند، مگر اینکه منبع به صراحت از طریق سربرگ Cross-Origin-Resource-Policy یا سربرگ CORS ( Access-Control-Allow-* و غیره) اجازه دهد.

There's also a reporting API , so you can gather data on requests that failed as a result of Cross-Origin-Embedder-Policy and Cross-Origin-Opener-Policy .

اگر فکر نمی‌کنید بتوانید این تغییرات را به موقع برای Chrome 92 انجام دهید، می‌توانید برای یک نسخه آزمایشی اصلی ثبت نام کنید تا رفتار کنونی Chrome Desktop را حداقل تا Chrome 113 حفظ کنید.

برای راهنمایی و اطلاعات بیشتر در مورد جداسازی منبع متقابل، بخش خواندن بیشتر در پایین این صفحه را بررسی کنید.

چگونه به اینجا رسیدیم؟

SharedArrayBuffer به کروم 60 رسید (برای کسانی از شما که به زمان به جای نسخه‌های کروم فکر می‌کنید، جولای 2017 است)، و همه چیز عالی بود. به مدت 6 ماه.

در ژانویه 2018 یک آسیب پذیری در برخی از CPU های محبوب آشکار شد. برای جزئیات کامل به اطلاعیه مراجعه کنید، اما اساساً به این معنی است که کد می تواند از تایمرهای با وضوح بالا برای خواندن حافظه ای که نباید به آن دسترسی داشته باشد استفاده کند.

این یک مشکل برای ما فروشندگان مرورگر بود، زیرا می‌خواهیم به سایت‌ها اجازه دهیم کد را در قالب جاوا اسکریپت و WASM اجرا کنند، اما به شدت حافظه‌ای را که این کد می‌تواند به آن دسترسی داشته باشد، کنترل کنیم. اگر وارد وب‌سایت من شوید، نباید از سایت بانکداری اینترنتی که شما باز دارید چیزی بخوانم. در واقع، من حتی نباید بدانم که شما سایت بانکداری اینترنتی خود را باز دارید. اینها اصول امنیت وب هستند.

برای کاهش این مشکل، وضوح تایمرهای با وضوح بالا مانند performance.now() را کاهش دادیم. با این حال، می‌توانید با استفاده از SharedArrayBuffer با تغییر حافظه در یک حلقه تنگ در یک کارگر، و خواندن آن در رشته‌ای دیگر، یک تایمر با وضوح بالا ایجاد کنید . این را نمی‌توان بدون تأثیر شدید روی کد با نیت خوب کاهش داد، بنابراین SharedArrayBuffer به طور کلی غیرفعال شد.

یک کاهش کلی این است که اطمینان حاصل شود که فرآیند سیستم یک صفحه وب حاوی داده های حساس از جاهای دیگر نیست. Chrome had invested in a multi-process architecture from the start ( remember the comic? ), but there were still cases where data from multiple sites could end up in the same process:

<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… -->

این APIها یک رفتار «میراثی» دارند که اجازه می‌دهد محتوایی از مبداهای دیگر بدون انتخاب از منبع دیگر استفاده شود. این درخواست‌ها با کوکی‌های منبع دیگر انجام می‌شوند، بنابراین یک درخواست «ورود به سیستم» است. امروزه، APIهای جدید به منبع دیگری نیاز دارند که با استفاده از CORS شرکت کند.

ما با جلوگیری از ورود محتوا به فرآیند صفحه وب در صورتی که «نادرست» به نظر برسد، پیرامون این APIهای قدیمی کار کردیم و آن را مسدود کردن خواندن با منبع متقابل نامیدیم. بنابراین، در موارد فوق، به JSON اجازه ورود به فرآیند را نمی‌دهیم، زیرا فرمت معتبری برای هیچ یک از آن APIها نیست. یعنی به جز iframes. برای iframes ما محتوا را در یک فرآیند متفاوت قرار می دهیم.

با وجود این اقدامات کاهشی، SharedArrayBuffer در Chrome 68 (ژوئیه 2018) مجدداً معرفی کردیم، اما فقط در دسک‌تاپ. الزامات فرآیند اضافی به این معنی است که ما نمی‌توانیم همین کار را در دستگاه‌های تلفن همراه انجام دهیم. همچنین اشاره شد که راه‌حل کروم ناقص بود، زیرا ما فقط قالب‌های داده «نادرست» را مسدود می‌کردیم، در حالی که ممکن است (اگرچه غیرعادی) تصاویر CSS/JS/ معتبر در URL‌های قابل حدس زدن حاوی داده‌های خصوصی باشند.

استانداردهای وب گرد هم آمدند تا راه حل کامل تری برای مرورگرهای متقابل ارائه کنند. راه حل این بود که به صفحات راهی داده شود تا بگویند "من بدین وسیله از توانایی خود برای وارد کردن محتوای با منبع دیگر به این فرآیند بدون انتخاب آنها صرف نظر می کنم". این اعلان از طریق هدرهای COOP و COEP ارائه شده با صفحه انجام می شود. مرورگر آن را اعمال می‌کند و در ازای آن، صفحه به SharedArrayBuffer و دیگر APIهایی با قدرت‌های مشابه دسترسی پیدا می‌کند. سایر منابع می توانند از طریق Cross-Origin-Resource-Policy یا CORS در جاسازی محتوا شرکت کنند.

فایرفاکس اولین کسی بود که SharedArrayBuffer با این محدودیت در نسخه 79 (ژوئیه 2020) عرضه کرد.

سپس در ژانویه 2021 این مقاله را نوشتم و شما آن را خواندید. سلام.

و ما الان اینجا هستیم. Chrome 88 SharedArrayBuffer را برای صفحاتی که از هم جدا شده اند به اندروید باز می گرداند و کروم 92 هم برای سازگاری و هم برای دستیابی به جداسازی کامل از مبدأ متقابل، همان الزامات را برای دسکتاپ به ارمغان می آورد.

تاخیر در تغییر کروم دسکتاپ

این یک استثنا موقت در قالب یک «آزمایی اصلی» است که به افراد زمان بیشتری برای پیاده‌سازی صفحات جدا شده با منبع متقاطع می‌دهد. SharedArrayBuffer بدون نیاز به ایزوله شدن صفحه با مبدا متقابل فعال می کند. این استثنا در Chrome 113 منقضی می‌شود و استثنا فقط برای Chrome Desktop اعمال می‌شود.

  1. برای مبدا خود یک نشانه درخواست کنید .
  2. توکن را به صفحات خود اضافه کنید. دو راه برای انجام آن وجود دارد:
    • یک تگ origin-trial <meta> به سر هر صفحه اضافه کنید. به عنوان مثال، ممکن است چیزی شبیه به این باشد:
      <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • اگر می‌توانید سرور خود را پیکربندی کنید، می‌توانید با استفاده از سرآیند Origin-Trial HTTP، توکن را نیز اضافه کنید. هدر پاسخ به دست آمده باید چیزی شبیه به این باشد:
      Origin-Trial: TOKEN_GOES_HERE

در ادامه مطلب

عکس بنر توسط دانیل گرگوار در Unsplash