خطمشی same-origin یک ویژگی امنیتی مرورگر است که نحوه تعامل اسناد و اسکریپتها در یک مبدأ با منابع در مبدأ دیگر را محدود میکند.
مرورگر میتواند منابع را از چندین سایت بهطور همزمان بار کند و نمایش دهد. ممکن است چندین برگه را بهطور همزمان باز کرده باشید، یا سایتی چندین iframe را از سایتهای مختلف جاسازی کرده باشد. اگر هیچ محدودیتی برای تعامل بین این منابع وجود نداشته باشد و مهاجمی به اسکریپت نفوذ کند، اسکریپت میتواند همه چیز را در مرورگر کاربر افشا کند.
خطمشی same-origin با مسدود کردن دسترسی خواندن به منابع بارشده از مبدأ متفاوت، از وقوع این اتفاق جلوگیری میکند. «اما صبر کنید،» میگویید، «من تصاویر و اسکریپتها را از مبدأهای دیگر همیشه بار میکنم.» مرورگرها به چند برچسب اجازه میدهند منابعی را از مبدأ دیگری جاسازی کنند. این خطمشی بیشتر یک مصنوع تاریخی است و میتواند سایت شما را دربرابر آسیبپذیریهایی مانند کلیکربایی بااستفاده از iframe قرار دهد. میتوانید خواندن میانمبدئی این برچسبها را بااستفاده از خطمشی امنیتی محتوا محدود کنید.
چه چیزی هممبدأ درنظر گرفته میشود؟
مبدأ با طرح (که بهعنوان پروتکل نیز شناخته میشود، برای مثال
HTTP یا HTTPS)، درگاه (اگر مشخص شده باشد)، و میزبان تعریف میشود. وقتی هر سه مورد برای دو نشانی وب یکسان باشد،
آنها هممبدأ درنظر گرفته میشوند. برای مثال،
http://www.example.com/foo مبدأ یکسانی با
http://www.example.com/bar دارد
اما با https://www.example.com/bar ندارد
زیرا طرح متفاوت است.
چه چیزی مجاز است و چه چیزی مسدود شده است؟
بهطور کلی، جاسازی منبع میانمبدئی مجاز است، درحالیکه خواندن منبع میانمبدئی مسدود است.
| iframes |
جاسازی میانمبدئی معمولاً مجاز است (بسته به دستورالعمل X-Frame-Options)، اما خواندن میانمبدئی (مانند استفاده از جاوا اسکریپت برای دسترسی به سند در iframe) مجاز نیست.
|
| CSS |
CSS میانمبدئی را میتوان بااستفاده از عنصر <link> یا @import در فایل CSS جاسازی کرد. ممکن است سرایند Content-Type صحیح لازم باشد.
|
| فرمها |
از نشانیهای وب میانمبدئی میتوان بهعنوان مقدار مشخصه action عناصر فرم استفاده کرد. برنامه وب میتواند دادههای فرم را در مقصد میانمبدئی بنویسد.
|
| تصاویر | جاسازی تصاویر میانمبدئی مجاز است. بااینحال، خواندن دادههای تصویر میانمبدئی (مانند بازیابی دادههای دودویی از تصویر میانمبدئی بااستفاده از جاوا اسکریپت) مسدود میشود. |
| چندرسانهای |
ویدیو و صدای میانمبدئی را میتوان بااستفاده از عناصر <video> و <audio> جاسازی کرد.
|
| دستورگان | متنهای میانمبدئی را میتوان جاسازی کرد؛ بااینحال، دسترسی به برخیاز میاناهای برنامهسازی کاربردی (مانند درخواستهای واکشی میانمبدئی) ممکن است مسدود شود. |
TODO: DevSite - Think and Check assessment
نحوه جلوگیری از کلیکربایی
حملهای بهنام «کلیکربایی» سایتی را در iframe جاسازی میکند و دکمههای شفافی را که به مقصد دیگری پیوند دارند روی آن قرار میدهد. کاربران فریب میخورند و فکر میکنند به برنامه شما دسترسی دارند، درحالیکه دادهها را برای مهاجمان ارسال میکنند.
برای مسدود کردن سایتهای دیگر از جاسازی سایت شما در iframe، یک خطمشی امنیتی محتوا با دستورالعمل frame-ancestors به سرایندهای HTTP اضافه کنید.
یا میتوانید X-Frame-Options را به سرایندهای HTTP اضافه کنید. برای مشاهده فهرست گزینهها،
MDN
را ببینید.
جمعبندی کردن
امیدواریم کمی خیالتان راحت شده باشد که مرورگرها سخت تلاش میکنند تا دروازهبان امنیت در وب باشند. باوجود اینکه مرورگرها سعی میکنند با مسدود کردن دسترسی به منابع، ایمن باشند، گاهی اوقات میخواهید در برنامههایتان به منابع میانمبدئی دسترسی داشته باشید. در راهنمای بعدی، با «همرسانی منبع میانمبدئی» (CORS) و نحوه اطلاع دادن به مرورگر درباره مجاز بودن بار کردن منابع میانمبدئی از منابع مورداعتماد آشنا شوید.