המונחים "same-site" ו-"same-origin" מצוטטים לעיתים קרובות, אבל הם לא מובנים כראוי. לדוגמה, הם מוזכרים בהקשר של מעברים בין דפים, בקשות fetch()
, קובצי cookie, חלונות קופצים נפתחים, משאבים מוטמעים ומסגרות iframe.
מקור
"Origin" הוא שילוב של
סכמה
(נקרא גם
פרוטוקול,
לדוגמה HTTP או
HTTPS),
שם מארח
ויציאה
(אם צוין). לדוגמה, בהינתן כתובת ה-URL https://www.example.com:443/foo
, הערך "origin" הוא https://www.example.com:443
.
'same-origin' ו-'cross-origin'
אתרים שיש בהם שילוב של אותה סכימה, שם מארח ויציאה נחשבים ל-'same-origin'. כל השאר נחשב כ-'cross-origin'.
מקור א' | מקור ב' | הסבר האם מקורות A ו-B הם "same-origin" או "cross-origin" |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | מקורות שונים: דומיינים שונים |
https://example.com:443 | מקורות שונים: תת-דומיינים שונים | |
https://login.example.com:443 | מקורות שונים: תת-דומיינים שונים | |
http://www.example.com:443 | בין מקורות: סכמות שונות | |
https://www.example.com:80 | מקורות שונים: יציאות שונות | |
https://www.example.com:443 | same-origin: התאמה מדויקת | |
https://www.example.com | same-origin: התאמות של מספר יציאה משתמע (443) |
אתר
דומיינים ברמה עליונה (TLD), כמו .com
ו-.org
, רשומים במסד הנתונים של Root Zone. בדוגמה שלמעלה, "site" הוא השילוב של הסכימה, ה-TLD והחלק של הדומיין שלפניו (אנחנו קוראים לו TLD+1). לדוגמה, אם נותנים את כתובת ה-URL https://www.example.com:443/foo
, הערך בשדה 'אתר' הוא https://example.com
.
רשימת סיומות ציבוריות ו-eTLD
בדומיינים שכוללים דברים כמו .co.jp
או .github.io
, השימוש רק ב-.jp
או ב-.io
לא מפורט מספיק כדי לזהות את ה "אתר". אין דרך לקבוע באופן אלגוריתמי את רמת הדומיינים שניתן לרשום לדומיין ספציפי ברמה העליונה.
לכן נוצרה רשימה של סיומות ציבוריות שמוגדרות ברשימת הסיומות הציבוריות. הסיומות הציבוריות האלה נקראים גם דומיינים ברמה עליונה בפועל (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 אחר נחשבים "אתרים שונים".
מקור א' | מקור ב' | הסבר האם מקורות א' וב' הם 'באותו אתר' או 'מאתרים שונים' |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | מאתרים שונים: דומיינים שונים |
https://login.example.com:443 | אותו אתר: תת-דומיינים שונים לא חשובים | |
http://www.example.com:443 | מאתרים שונים: סכמות שונות | |
https://www.example.com:80 | same-site: יציאות שונות לא משנה | |
https://www.example.com:443 | same-site: התאמה מדויקת | |
https://www.example.com | same-site: יציאות לא חשובות |
'schemeless same-site'
ההגדרה של 'אותו אתר' התפתחה להתייחס לסכימת כתובת ה-URL כחלק מהאתר, כדי למנוע שימוש ב-HTTP כערוץ חלש.
המושג הישן של "אותו אתר" ללא השוואת סכימה נקרא עכשיו
"באותו אתר ללא סכמה". לדוגמה, http://www.example.com
ו-https://www.example.com
נחשבים לאותו אתר ללא סכימה, אבל לא לאותו אתר, כי רק החלק eTLD+1 חשוב והסכימה לא נלקחת בחשבון.
מקור א' | מקור ב' | הסבר אם מקורות A ו-B הם 'ללא סכימה באותו אתר' |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | מאתרים שונים: דומיינים שונים |
https://login.example.com:443 | אותו אתר ללא הסכמה: תת-דומיינים שונים לא משנה | |
http://www.example.com:443 | באותו אתר ללא סכימה: אין חשיבות לסכמות שונות | |
https://www.example.com:80 | באותו אתר ללא סכימה: אין חשיבות ליציאות שונות | |
https://www.example.com:443 | באותו אתר ללא סכימה: התאמה מדויקת | |
https://www.example.com | באותו אתר ללא סכימה: ליציאות אין חשיבות |
איך בודקים אם הבקשה היא מסוג 'same-site', 'same-origin' או 'cross-site'
כל הדפדפנים המודרניים (Safari תומכים בקרוב) שולחים בקשות עם Sec-Fetch-Site
כותרת HTTP. לכותרת יש אחד מהערכים הבאים:
cross-site
same-site
same-origin
none
על ידי בחינת הערך של Sec-Fetch-Site
, אפשר לקבוע אם הבקשה היא "same-site", "same-origin" או "cross-site".