اصطلاحات "Same-site" و "Same-origin" اغلب ذکر می شوند، اما اغلب به اشتباه درک می شوند. به عنوان مثال، آنها در زمینه انتقال صفحه، درخواستهای fetch()
، کوکیها، باز کردن پنجرههای بازشو، منابع جاسازی شده و iframe استفاده میشوند. این صفحه توضیح می دهد که آنها چیست و چگونه با یکدیگر متفاوت هستند.
اصل و نسب
"Origin" ترکیبی از یک طرح (همچنین به عنوان پروتکل شناخته می شود، برای مثال HTTP یا HTTPS )، یک نام میزبان ، و یک پورت (در صورت مشخص شدن). برای مثال، با توجه به URL https://www.example.com:443/foo
، "origin" https://www.example.com:443
است.
"منشا یکسان" و "مبدأ متقابل"
وبسایتهایی که ترکیبی از طرح، نام میزبان و پورت یکسان دارند، «منشأ یکسان» در نظر گرفته میشوند. هر چیز دیگری "منشا متقاطع" در نظر گرفته می شود.
مبدا A | مبدا B | "همان منشاء" یا "تقاطع"؟ |
---|---|---|
https://www.example.com:443 | https://www.evil.com :443 | مبدا متقابل: دامنه های مختلف |
https:// example.com :443 | Cross-origin: زیر دامنه های مختلف | |
https:// login .example.com:443 | Cross-origin: زیر دامنه های مختلف | |
http://www.example.com:443 | مبدا متقابل: طرح های مختلف | |
https://www.example.com: 80 | مبدا متقابل: پورت های مختلف | |
https://www.example.com:443 | منشا یکسان: مطابقت دقیق | |
https://www.example.com | منشا یکسان: شماره پورت ضمنی (443) مطابقت دارد |
سایت
دامنه های سطح بالا (TLD) مانند .com
و .org
در پایگاه داده Root Zone فهرست شده اند. در قبلی
به عنوان مثال، "سایت" ترکیبی از طرح ، TLD ، و بخشی از دامنه درست قبل از آن است (ما آن را TLD+1 می نامیم). برای مثال، با توجه به URL https://www.example.com:443/foo
، "سایت" https://example.com
است.
فهرست پسوند عمومی و eTLD
برای دامنه هایی با عناصری مانند .co.jp
یا .github.io
، استفاده از .jp
یا .io
به اندازه کافی برای شناسایی «سایت» خاص نیست. هیچ راهی برای تعیین الگوریتمی سطح دامنه های قابل ثبت برای یک TLD خاص وجود ندارد. برای کمک به آن، فهرست پسوندهای عمومی فهرستی از پسوندهای عمومی را تعریف می کند که TLD های موثر (eTLD) نیز نامیده می شوند. فهرست eTLD ها در publicsuffix.org/list نگهداری می شود.
برای شناسایی قسمت "سایت" دامنه ای که شامل eTLD است، همان روشی را که در مثال با .com
انجام دادید، اعمال کنید. با در نظر گرفتن https://www.project.github.io:443/foo
به عنوان مثال، طرح https
، eTLD .github.io
و eTLD+1 project.github.io
است، بنابراین https://project.github.io
"سایت" برای این URL در نظر گرفته می شود.
"Same-site" و "Cross-site"
وبسایتهایی که دارای طرح یکسان و eTLD+1 یکسان هستند «همان سایت» در نظر گرفته میشوند. وبسایتهایی که طرح متفاوتی دارند یا eTLD+1 متفاوتی دارند «متقابل سایت» هستند.
مبدا A | مبدا B | "Same-site" یا "Cross-site"؟ |
---|---|---|
https://www.example.com:443 | https://www.evil.com :443 | Cross-site: دامنه های مختلف |
https:// login .example.com:443 | همان سایت: زیر دامنه های مختلف مهم نیستند | |
http://www.example.com:443 | Cross-site: طرح های مختلف | |
https://www.example.com: 80 | همان سایت: پورت های مختلف مهم نیست | |
https://www.example.com:443 | همان سایت: مطابقت دقیق | |
https://www.example.com | همان سایت: پورت ها مهم نیستند |
"همان سایت بدون طرح"
برای جلوگیری از استفاده از HTTP به عنوان یک کانال ضعیف، تعریف "همان سایت" تغییر کرد تا طرح URL را به عنوان بخشی از سایت در بر گیرد. مفهوم قدیمی تر "سایت یکسان" بدون مقایسه طرح، اکنون "همان سایت بدون طرح" نامیده می شود. برای مثال، http://www.example.com
و https://www.example.com
به عنوان یک سایت بدون طرح در نظر گرفته می شوند، اما یک سایت یکسان نیستند، زیرا فقط قسمت eTLD+1 مهم است و این طرح در نظر گرفته نمی شود.
مبدا A | مبدا B | "Schemeless same-site" یا "cross-site"؟ |
---|---|---|
https://www.example.com:443 | https://www.evil.com :443 | Cross-site: دامنه های مختلف |
https:// login .example.com:443 | همان سایت بدون طرح: زیر دامنه های مختلف مهم نیستند | |
http://www.example.com:443 | همان سایت بدون طرح: طرحهای مختلف مهم نیستند | |
https://www.example.com: 80 | همان سایت بدون طرح: پورت های مختلف مهم نیستند | |
https://www.example.com:443 | همان سایت بدون طرح: مطابقت دقیق | |
https://www.example.com | همان سایت بدون طرح: پورت ها مهم نیستند |
چگونه بررسی کنیم که آیا یک درخواست "همان سایت"، "همان منبع" یا "مقطع سایت" است
همه مرورگرهای مدرن درخواست ها را با سرآیند Sec-Fetch-Site
HTTP ارسال می کنند. هدر یکی از مقادیر زیر را دارد:
-
cross-site
-
same-site
(اشاره به همان سایت طرح دار) -
same-origin
-
none
میتوانید مقدار Sec-Fetch-Site
را بررسی کنید تا مشخص کنید درخواست یک سایت، یک منبع یا متقاطع است.
شما می توانید به طور منطقی به مقدار هدر Sec-Fetch-Site
اعتماد کنید، زیرا:
- سرصفحه های HTTP که با
Sec-
شروع می شوند توسط جاوا اسکریپت قابل تغییر نیستند - مرورگر همیشه این عناوین را تنظیم می کند.