بیاموزید که چرا برای استفاده از ویژگیهای قدرتمندی مانند SharedArrayBuffer
، performance.measureUserAgentSpecificMemory()
و تایمر با وضوح بالا با دقت بهتر، به جداسازی متقاطع نیاز است.
در ساختن وبسایت خود با استفاده از COOP و COEP "مبدع متقاطع ایزوله" توضیح دادیم که چگونه با استفاده از COOP و COEP به حالت "منشأ متقاطع جدا شده" برسیم. این مقاله همراهی است که توضیح میدهد چرا برای فعال کردن ویژگیهای قدرتمند در مرورگر به جداسازی منبع متقابل نیاز است.
وب بر اساس خط مشی مبدا یکسان ساخته شده است: یک ویژگی امنیتی که نحوه تعامل اسناد و اسکریپت ها با منابع منبع دیگر را محدود می کند. این اصل راههایی را که وبسایتها میتوانند به منابع متقاطع دسترسی داشته باشند، محدود میکند. به عنوان مثال، سندی از https://a.example
از دسترسی به داده های میزبانی شده در https://b.example
جلوگیری می کند.
با این حال، سیاست همان مبدأ دارای برخی استثناهای تاریخی بوده است. هر وب سایتی می تواند:
- iframe های متقاطع را جاسازی کنید
- منابع متقاطع مانند تصاویر یا اسکریپت ها را شامل شود
- پنجره های بازشوی متقاطع را با یک مرجع DOM باز کنید
اگر وب می توانست از ابتدا طراحی شود، این استثناها وجود نداشتند. متأسفانه، زمانی که جامعه وب به مزایای کلیدی یک خط مشی دقیق همان مبدأ پی برد، وب قبلاً بر این استثناها تکیه کرده بود.
عوارض جانبی امنیتی چنین سیاست سهل انگاری از دو طریق اصلاح شد. یک راه از طریق معرفی پروتکل جدیدی به نام Cross Origin Resource Sharing (CORS) بود که هدف آن اطمینان از اینکه سرور اجازه به اشتراک گذاری منبعی با مبدأ مشخص را می دهد. راه دیگر حذف ضمنی دسترسی مستقیم اسکریپت به منابع متقاطع با حفظ سازگاری با عقب است. چنین منابعی با منشاء متقاطع، منابع "مات" نامیده می شوند. به عنوان مثال، به همین دلیل است که دستکاری پیکسل های یک تصویر متقاطع از طریق CanvasRenderingContext2D
ناموفق است مگر اینکه CORS روی تصویر اعمال شود.
همه این تصمیمات خط مشی در یک گروه زمینه مرور اتفاق می افتد.
برای مدت طولانی، ترکیب CORS و منابع غیر شفاف برای ایمن کردن مرورگرها کافی بود. گاهی اوقات موارد لبه (مانند آسیبپذیریهای JSON ) کشف میشد و نیاز به اصلاح داشت، اما در کل اصل اجازه ندادن دسترسی خواندن مستقیم به بایتهای خام منابع متقاطع موفقیتآمیز بود.
همه اینها با Spectre تغییر کرد، که باعث می شود هر داده ای که در همان گروه زمینه مرور بارگذاری می شود به عنوان کد شما قابل خواندن باشد. با اندازهگیری زمان انجام عملیات خاص، مهاجمان میتوانند محتویات حافظه پنهان CPU و از طریق آن، محتویات حافظه پردازش را حدس بزنند. چنین حملات زمانبندی با تایمرهایی با دانهبندی پایین که در پلتفرم وجود دارد امکانپذیر است، اما میتوان با تایمرهایی با دانهبندی بالا، هم صریح (مانند 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
علامت گذاری شده اند می توانند توسط هر وب سایتی بارگیری شوند. ( این مقدار به همراه COEP به مشخصات CORP اضافه شد.)
خط مشی بازکننده Cross Origin (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، مراحل پیادهسازی آن را بیاموزید.