כדאי להבין למה צריך בידוד ממקורות שונים כדי להשתמש בתכונות מתקדמות כמו SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
וטיימר ברזולוציה גבוהה בצורה מדויקת יותר.
מבוא
בהפיכת האתר ל"מבודד ממקורות שונים" באמצעות COOP COEP הסברנו איך לאמץ 'ריבוי מקורות' מבודד" באמצעות COOP ו-COEP. זהו מאמר נלווה שמסביר למה נדרש בידוד ממקורות שונים כדי להפעיל תכונות מתקדמות בדפדפן.
רקע
האינטרנט מבוסס על אותו מקור
[מדיניות]: תכונת אבטחה שמגבילה
האופן שבו מסמכים וסקריפטים יכולים לקיים אינטראקציה עם משאבים ממקור אחר. הזה
העיקרון מגביל את הדרכים שבהן אתרים יכולים לגשת למשאבים ממקורות שונים. עבור
לדוגמה, אין גישה לנתונים ממסמך מ-https://a.example
מתארח בכתובת https://b.example
.
עם זאת, למדיניות המקור הזהה היו כמה חריגים היסטוריים. כל אתר יכול:
- הטמעת iframes ממקורות שונים
- הכללת משאבים ממקורות שונים, כמו תמונות או סקריפטים
- פתיחת חלונות קופצים ממקורות שונים עם הפניה של DOM
אם ניתן לעצב את האינטרנט מאפס, החריגים האלה לא היו קיימים. לצערנו, עד שקהילת האינטרנט הביאה את היתרונות העיקריים המחמירה של אותו מקור, האינטרנט כבר הסתמך על החריגים האלה.
תופעות הלוואי של האבטחה של מדיניות מקור זהה כזו תוקנו בשני שלבים
דרכים שונות. דרך אחת הייתה השקה של פרוטוקול חדש בשם Cross-cross
שיתוף משאבי מקור (CORS)
שמטרתו לוודא שהשרת מאפשר שיתוף משאב עם
מקור נתון. הדרך השנייה היא הסרה מרומזת של הגישה הישירה לסקריפט
של משאבים ממקורות שונים תוך שמירה על תאימות לאחור. כאלה
משאבים ממקורות שונים נקראים "אטומים" המשאבים. לדוגמה, זו הסיבה לכך
ביצוע מניפולציות על הפיקסלים של תמונה ממקורות שונים באמצעות CanvasRenderingContext2D
ייכשל אלא אם CORS מוחל על התמונה.
כל ההחלטות האלה לגבי המדיניות מתבצעות בתוך קבוצת הקשר של גלישה.
במשך תקופה ארוכה, השילוב של CORS ומשאבים אטומים הספיק ליצירת בדפדפנים בטוחים. לפעמים מקרי קצה (למשל, JSON) נקודות חולשה) התגלו, והיה צורך לתקן אותם, אבל העקרון הכולל של האפשרות לקבל גישה ישירה לקריאה לבייטים הגולמיים של משאבים ממקורות שונים הייתה הפעולה הצליחה.
כל זה השתנה עם
Spectre,
יוצר נתונים שנטענים לאותה קבוצת הקשר של גלישה שבה נמצא הקוד שלך
עשוי להיות קריא. באמצעות מדידת הזמן של פעולות מסוימות, תוקפים
יכול לנחש מה תוכן המטמון של המעבד (CPU), ובאמצעותו תוכן
עיבוד זיכרון. מתקפות תזמון כאלה אפשריות באמצעות טיימרים בעלי רמת פירוט נמוכה
שקיימים בפלטפורמה, אבל אפשר להאיץ אותם באמצעות טיימרים בצפיפות גבוהה,
גם מפורש (כמו performance.now()
) וגם מרומז (כמו
SharedArrayBuffer
שניות). אם ב-evil.com
מוטמעים תמונה ממקורות שונים, הם יכולים להשתמש
מתקפת ספקטר לקריאת נתוני הפיקסלים שלה, ולכן ההגנות מסתמכות על
'אטימוּת' לא יעילה.
באופן אידיאלי, כל הבקשות ממקורות שונים צריכים להיבדק באופן מפורש על ידי השרת שהוא הבעלים של המשאב. אם הבדיקה לא מסופקת על ידי לשרת בעלי המשאבים, הנתונים אף פעם לא יגיעו קבוצת הקשר של שחקן רשע, ולכן תישאר מחוץ להישג ידם של כל ספקטר תוקפים את דף האינטרנט. אנחנו קוראים למצב הזה 'מצב מבודד ממקורות שונים'. זה בדיוק הנושא של COOP+COEP.
במצב מבודד ממקורות שונים, האתר ששולח את הבקשה נחשב פחות
מסוכן, וכתוצאה מכך הגישה לתכונות מתקדמות כמו SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
ורזולוציה גבוהה
טיימרים מדויקים יותר,
יכול לשמש להתקפות 'ספקטר'. היא גם מונעת שינויים
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.
באופן דומה, אפשר לאחזר נתונים ממקורות שונים באמצעות ה-method 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
. (זה
נוסף אל value
המפרט של CORP יחד עם COEP).
מדיניות פתיחה בין מקורות
מדיניות בנושא פותחן ממקורות שונים
(COOP) מאפשר לכם לוודא
שחלון ברמה עליונה מבודד ממסמכים אחרים על ידי הצבתם
לקבוצת הקשר שונה של גלישה, כך שהם לא יכולים לקיים אינטראקציה ישירה עם
החלון ברמה העליונה. לדוגמה, אם מסמך עם COOP נפתח בחלון קופץ,
הנכס window.opener
יהיה null
. בנוסף, המאפיין .closed
של
ההפניה של ה-Opener תחזיר את הערך 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.