המונחים 'אותו אתר' ו'אותו מקור' מצוטטים לעיתים קרובות, אבל המונחים שהם לא מובנים להם נכון. לדוגמה, הם בשימוש בהקשר של מעברים בין דפים, בקשות fetch()
, קובצי cookie, חלונות קופצים נפתחים, משאבים מוטמעים ומסגרות iframe. בדף הזה נסביר מה הם ואיך הם שונים זה מזה.
מקור
![מקור](https://web.dev/static/articles/same-site-same-origin/image/origin-scheme.png?authuser=5&hl=he)
"Origin" הוא שילוב של
סכמה
(נקרא גם
פרוטוקול,
לדוגמה HTTP או
HTTPS),
שם מארח
ויציאה
(אם צוין). לדוגמה, בהינתן כתובת ה-URL https://www.example.com:443/foo
, הערך "origin" הוא https://www.example.com:443
.
'Same-origin' ו-'cross-origin'
אתרים שיש בהם שילוב זהה של סכימה, שם מארח ויציאה נחשבים ל "אותו מקור". כל השאר נחשב כ-'cross-origin'.
מקור א' | מקור ב' | '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 | אותו מקור: התאמה מדויקת | |
https://www.example.com | אותו מקור: התאמות של מספר יציאה משתמע (443) |
אתר
![אתר (TLD+1)](https://web.dev/static/articles/same-site-same-origin/image/site-tld1-ae5ebbc587fbe.png?authuser=5&hl=he)
דומיינים ברמה עליונה (TLD), כמו .com
ו-.org
, רשומים במסד הנתונים של Root Zone. בדוגמה
הקודמת, "site" הוא שילוב של הסכימה, ה-TLD והחלק של הדומיין שלפניו (אנחנו קוראים לו TLD+1). לדוגמה, אם נותנים את כתובת ה-URL https://www.example.com:443/foo
, הערך בשדה 'site' הוא 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 הזו.
![אתר (eTLD+1)](https://web.dev/static/articles/same-site-same-origin/image/site-etld1-2ffebe0e355bd.png?authuser=5&hl=he)
'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 | אותו אתר: אין חשיבות ליציאות שונות | |
https://www.example.com:443 | אותו אתר: התאמה מדויקת | |
https://www.example.com | אותו אתר: יציאות לא חשובות |
"באותו אתר ללא סכימה"
![אותו אתר ללא סכימה](https://web.dev/static/articles/same-site-same-origin/image/schemeless-same-site-3ba215c9666cd.png?authuser=5&hl=he)
ההגדרה של 'אותו אתר' השתנתה והיא כוללת את סכמת כתובת ה-URL כחלק מהאתר, כדי למנוע שימוש ב-HTTP כערוץ חלש.
המושג הישן של "אותו אתר" ללא השוואת סכימה נקרא עכשיו
"באותו אתר ללא סכמה". לדוגמה, http://www.example.com
ו-https://www.example.com
נחשבים לאותו אתר ללא סכימה, אבל לא לאותו אתר, כי רק החלק 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 | באותו אתר ללא סכימה: אין חשיבות ליציאות שונות | |
https://www.example.com:443 | ללא סכימה של אותו אתר: התאמה מדויקת | |
https://www.example.com | באותו אתר ללא סכימה: אין חשיבות ליציאות |
איך בודקים אם הבקשה היא מסוג 'same-site', 'same-origin' או 'cross-site'
כל הדפדפנים המודרניים שולחים בקשות עם כותרת HTTP Sec-Fetch-Site
.
הכותרת כוללת אחד מהערכים הבאים:
cross-site
same-site
(מתייחסת לאותו אתר סכמה)same-origin
none
אפשר לבדוק את הערך של Sec-Fetch-Site
על מנת לקבוע אם הבקשה היא same-site, Same-origin או Cross-site.
סביר להניח שאפשר לסמוך על הערך של הכותרת Sec-Fetch-Site
, מהסיבות הבאות:
- לא ניתן לשנות כותרות HTTP שמתחילות ב-
Sec-
על ידי JavaScript - הדפדפן תמיד מגדיר את הכותרות האלה.