منتشر شده: ۴ مه ۲۰۲۰
در «ایزولهسازی متقابل مبدأ» وبسایت خود با استفاده از COOP و COEP، نحوهی تطبیق با حالت «ایزولهسازی متقابل مبدأ» را با استفاده از COOP و COEP توضیح دادیم. این یک مقالهی همراه است که توضیح میدهد چرا ایزولاسیون متقابل مبدأ برای فعال کردن ویژگیهای قدرتمند در مرورگر مورد نیاز است.
واژهنامه
این سند از بسیاری از اصطلاحات با نامهای مشابه و اختصارات استفاده میکند. برای روشن شدن، ما یک واژهنامه کوچک تهیه کردهایم:
- COEP: Cross Origin Embedder Policy
- COOP: سیاست افتتاحیه بین مبدائی
- CORP: سیاست منابع بینمنبعی
- CORS: اشتراکگذاری منابع بینمنشأیی
- CORB: مسدود کردن خواندن متقابل مبدا
پیشینه
وب بر اساس سیاست same-origin ساخته شده است، یک ویژگی امنیتی که نحوه تعامل اسناد و اسکریپتها با منابع از مبدا دیگر را محدود میکند. این اصل، روشهای دسترسی وبسایتها به منابع بین مبدایی را محدود میکند. به عنوان مثال، از دسترسی یک سند از https://a.example به دادههای میزبانی شده در https://b.example جلوگیری میشود.
با این حال، سیاست same-origin استثنائاتی در طول تاریخ داشته است. هر وبسایتی میتواند:
- جاسازی آیفریمهای کراس-اوریجین
- منابع بینمنبعی مانند تصاویر یا اسکریپتها را در نظر بگیرید
- پنجرههای محاورهای بین مبدا و مقصد را با مرجع DOM باز کنید
زمانی که جامعه وب به مزایای سیاست سختگیرانهی same-origin پی برد، وب از قبل به این استثنائات متکی بود.
عوارض جانبی امنیتی چنین سیاست سهلانگارانهای در مورد مبدا یکسان، به دو روش اصلاح شد:
- پروتکل اشتراکگذاری منابع بین مبدایی (CORS) تضمین میکند که سرور اجازه اشتراکگذاری یک منبع با مبدا مشخص را میدهد.
- توسعهدهندگان بهطور ضمنی دسترسی مستقیم اسکریپت به منابع بینمنبعی را حذف میکنند، در حالی که سازگاری معکوس را حفظ میکنند. چنین منابع بینمنبعی، منابع "مات" نامیده میشوند. به همین دلیل است که دستکاری پیکسل بینمنبعی با
CanvasRenderingContext2Dبا شکست مواجه میشود، مگر اینکه CORS به تصویر اعمال شود.
همه این تصمیمات مربوط به سیاستها در یک گروه زمینه مرور اتفاق میافتد.

برای مدت طولانی، این ترکیب برای ایمن نگه داشتن مرورگرها کافی بود، به جز موارد محدودی که نیاز به وصله مستقیم داشتند (مانند آسیبپذیریهای JSON ).
این با Spectre تغییر کرد، که هر دادهای را که در همان گروه زمینه مرور مانند کد شما بارگذاری میشود، به طور بالقوه قابل خواندن میکند. با اندازهگیری زمانی که عملیات خاص طول میکشد، مهاجمان میتوانند محتویات حافظه پنهان CPU و بنابراین محتویات حافظه فرآیند را حدس بزنند. چنین حملاتی با تایمرهای با جزئیات کم که در پلتفرم وجود دارند، امکانپذیر است و میتوان آنها را با تایمرهای با جزئیات بالا، چه صریح (مانند performance.now() ) و چه ضمنی (مانند SharedArrayBuffer ) تسریع کرد.
اگر evil.com یک تصویر با منشأ متقابل را جاسازی کند، میتواند از حمله Spectre برای خواندن دادههای پیکسلی تصویر جاسازیشده استفاده کند. این امر محافظتهایی را که به «مات بودن» متکی هستند، بیاثر میکند.

در حالت ایدهآل، تمام درخواستهای بین مبدایی توسط سروری که مالک منبع است، بررسی میشوند. اگر بررسی انجام نشده باشد، دادهها هرگز نباید به گروه زمینه مرور یک عامل مخرب برسند. بنابراین، دادهها از دسترس حملات احتمالی Spectre دور میمانند. ما این را حالت ایزوله بین مبدایی مینامیم.
وقتی کد جاسازیشده در حالت ایزوله بین مبدا (cross-origin isolation) قرار دارد، سایت درخواستکننده کمتر خطرناک تلقی میشود. این امر به سایت درخواستکننده اجازه میدهد تا از SharedArrayBuffer ، performance.measureUserAgentSpecificMemory() و تایمرهای با وضوح بالا با دقت بهتر استفاده کند، ضمن اینکه از حملات احتمالی Spectre جلوگیری میکند. این حالت همچنین از تغییر document.domain جلوگیری میکند.
سیاست جاسازی متقابل مبدا
سیاست جاسازی متقابل منبع (COEP) مانع از بارگیری هرگونه منبع متقابل منبعی میشود که صریحاً مجوز سند را با CORP یا CORS اعطا نمیکنند. با این ویژگی، میتوانید اعلام کنید که یک سند نمیتواند چنین منابعی را بارگیری کند.

a.example ، سیاست COEP را روی require-corp تنظیم کرده است. a.example میخواهد ۳ فایل از b.example را جاسازی کند، اما فقط دو فایل با موفقیت جاسازی میشوند. دو جاسازی موفق شامل یک فایل جاوا اسکریپت با سیاست CORP از نوع cross-origin و یک تصویر با CORS مجاز است. فایل سوم ویدیویی است که سیاست CORP آن ایجاب میکند که فایل فقط در همان مبدا جاسازی شود، بنابراین ویدیو در a.example بارگیری نمیشود.برای فعال کردن این خطمشی، هدر HTTP زیر را به سند اضافه کنید:
Cross-Origin-Embedder-Policy: require-corp
COEP یک مقدار واحد به نام require-corp میگیرد. این سیاست را اعمال میکند که سند فقط میتواند منابعی را از همان مبدأ یا منابعی را که به صراحت به عنوان قابل بارگیری از مبدأ دیگری علامتگذاری شدهاند، بارگیری کند.
برای اینکه منابع از مبدا دیگری قابل بارگیری باشند، باید از اشتراکگذاری منابع بین مبدایی (CORS) یا سیاست منابع بین مبدایی (CORP) پشتیبانی کنند.
اشتراکگذاری منابع بینمنشأیی
اگر یک منبع بینمنبعی از اشتراکگذاری منابع بینمنبعی (CORS) پشتیبانی کند، میتوانید از ویژگی crossorigin برای بارگذاری آن در صفحه وب خود بدون مسدود شدن توسط COEP استفاده کنید.
<img src="https://third-party.example.com/image.jpg" crossorigin>
برای مثال، اگر این منبع تصویر با هدرهای CORS ارائه میشود، از ویژگی crossorigin استفاده کنید تا درخواست برای دریافت منبع از حالت CORS استفاده کند. این کار همچنین از بارگیری تصویر جلوگیری میکند مگر اینکه هدرهای CORS را تنظیم کند.
به طور مشابه، میتوانید دادههای بین مبدا (cross origin) را از طریق متد 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 مشخص شدهاند، میتوانند توسط هر وبسایتی بارگذاری شوند. ( این مقدار به همراه COEP به مشخصات CORP اضافه شده است.)
سیاست افتتاحیه کراس اوریجین
سیاست بازکنندهی متقابل (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 پیادهسازی کنید.