אינטראקציות מאובטחות של חלונות קופצים עם נכסים מוגבלים

קבלת בידוד מדומיינים שונים והגנה מפני דליפות נתונים מאתרים שונים במהלך אינטראקציה עם חלונות קופצים.

ערך חדש זמין עבור מדיניות פותחן מרובת מקורות (COOP): restrict-properties. היא מספקת יתרונות אבטחה ומקלה על הטמעה של בידוד בין מקורות שונים, תוך מתן אפשרות לאתר שלכם ליצור אינטראקציה עם חלונות קופצים של צד שלישי לצורך תשלומים, אימות או תרחישי שימוש אחרים.

כדי להתחיל להתנסות ב-restrict-properties, אפשר להשתתף בגרסת המקור לניסיון החל מ-Chrome 116.

למה כדאי להשתמש ב-restrict-properties

יש שני תרחישי שימוש עיקריים ב-restrict-properties:

מניעת הדלפות חוצות אתרים בלי לגרום לשיבושים

כברירת מחדל, כל אתר יכול לפתוח את האפליקציה שלכם בחלון קופץ ולקבל הפניה אליה.

אתר זדוני יכול לנצל את זה כדי לבצע מתקפות כמו דליפות בין אתרים. כדי לצמצם את הסיכון הזה, אפשר להשתמש בכותרת Cross-Origin-Opener-Policy (COOP).

עד עכשיו, האפשרויות שלכם לCross-Origin-Opener-Policy היו מוגבלות. אפשר:

  • הגדרת same-origin, שחוסמת את כל האינטראקציות עם פריטים קופצים ממקורות שונים.
  • מגדירים את same-origin-allow-popups, שחוסם את כל האינטראקציות בין מקורות שפותחות את האתר שלכם בחלון קופץ.
  • מגדירים את הערך unsafe-none, שמאפשר את כל האינטראקציות חוצות-המקורות עם פריטים קופצים.

כתוצאה מכך, אתרים שצריכים להיפתח בחלון קופץ ולבצע אינטראקציה עם הדף שממנו הם נפתחו לא יכולים לאכוף את COOP. כך נשארו תרחישי שימוש מרכזיים כמו כניסה יחידה ותשלומים ללא הגנה מפני דליפות נתונים מאתרים שונים.

Cross-Origin-Opener-Policy: restrict-properties פותר את הבעיה.

עם restrict-properties, נכסים שאפשר להשתמש בהם לספירת פריימים ולמתקפות אחרות של דליפת נתונים באתרים שונים לא זמינים – אבל מותרת תקשורת בסיסית בין חלונות באמצעות postMessage ו-closed.

כך משפרים את האבטחה של האתר בלי לפגוע בתרחישי שימוש חשובים. לדוגמה:

  • אם אתם מספקים שירות בחלון קופץ, הגדרת Cross-Origin-Opener-Policy: restrict-properties תגן עליכם מפני מגוון רחב של מתקפות שגורמות לדליפת נתונים בין אתרים. עדיין אפשר לפתוח את כל הדפים שאפשר היה לפתוח קודם.
  • אם אתם צריכים לגשת לחלון קופץ ממקורות שונים, הגדרת Cross-Origin-Opener-Policy: restrict-properties תגן על האתר שלכם מפני ספירת iframe באופן דומה. תוכלו לפתוח את אותה קבוצה של חלונות קופצים שאתם יכולים לפתוח היום.
  • אם גם הדף הפותח וגם הדף שנפתח מגדירים את הכותרת, והדפים הם חוצי-מקור, ההתנהגות דומה למצב שבו רק אחד מהם הגדיר את הכותרת. אם הם מאותו מקור, תינתן גישה מלאה.

איך להגדיר את האתר כחסום לגישה מדומיינים אחרים

למה צריך חסימה לגישה מדומיינים אחרים

חלק מ-API האינטרנט מגדילים את הסיכון להתקפות בערוץ צדדי כמו Spectre. כדי לצמצם את הסיכון הזה, דפדפנים מציעים סביבה מבודדת שנקראת חסימה לגישה מדומיינים אחרים, שניתן להפעיל אותה. במצב של בידוד מדומיינים אחרים, דף האינטרנט יכול להשתמש בתכונות עם הרשאות מיוחדות, כולל SharedArrayBuffer,‏ performance.measureUserAgentSpecificMemory() וטיימרים ברזולוציה גבוהה, תוך בידוד המקור מאחרים, אלא אם הם הופעלו.

עד עכשיו, כדי להשתמש בממשקי ה-API האלה, הייתם צריכים להגדיר את Cross-Origin-Opener-Policy: same-origin. עם זאת, הפעולה הזו תשבור כל תהליך של חלון קופץ חוצה מקורות שאתם עשויים להזדקק לו, כמו כניסה יחידה ותשלומים.

מעכשיו אפשר להשתמש ב-Cross-Origin-Opener-Policy: restrict-properties במקום ב-Cross-Origin-Opener-Policy: same-origin כדי להפעיל חסימה לגישה מדומיינים אחרים. במקום לנתק את הקשר עם הפותח, הוא רק מגביל אותו לקבוצת המשנה המינימלית של התקשורת ב-window.postMessage() וב-window.closed.

תוכלו להפעיל בידוד בין מקורות שונים באמצעות שני ההידרים הבאים:

Cross-Origin-Opener-Policy: restrict-properties
Cross-Origin-Embedder-Policy: require-corp

או

Cross-Origin-Opener-Policy: restrict-properties
Cross-Origin-Embedder-Policy: credentialless

מידע נוסף על credentialless זמין במאמר טעינת משאבים ממקורות שונים ללא כותרות CORP באמצעות COEP: credentialless.

הדגמה (דמו)

אפשר לנסות אפשרויות שונות של כותרות בהדגמה הזו של בידוד בין מקורות שונים.

ניסוי עם גרסת המקור לניסיון

כדי להתנסות ב-Cross-Origin-Opener-Policy: restrict-properties, צריך להצטרף לגרסת מקור לניסיון.

תמיכה בדפדפנים

בשלב הזה, Cross-Origin-Opener-Policy: restrict-properties נתמך רק ב-Chrome. בדפדפנים אחרים מתנהל דיון פעיל בנושא התקנים.

שאלות נפוצות

האתר שלי צריך לתקשר עם חלונות קופצים מאותו מקור. האם כדאי להשתמש ב-COOP: restrict-properties כדי להפעיל חסימה לגישה מדומיינים אחרים?

הגדרה של COOP: restrict-properties גם בחלון הקופץ וגם בדף הראשי לא תגרום להגבלות. אם מגדירים את ההגדרה הזו רק בחלון הקופץ או רק בדף הראשי, לא תהיה גישה לנכסים אחרים מלבד postMessage ו-closed בחלון הפותח, גם אם הם מאותו מקור.

האם קבוצת הנכסים המותרים קבועה?

על סמך המשוב שקיבלנו עד עכשיו, אנחנו חושדים ש-window.postMessage ו-window.closed יספיקו לרוב תהליכי העבודה, אבל אנחנו עדיין שוקלים לפתוח את האפשרות הזו לנכסים אחרים. אם יש לכם תרחיש שימוש שלא ניתן לפתור באמצעות postMessage ו-closed בלבד, אתם יכולים להשאיר משוב בשרשור בנושא הכוונה להתנסות.

משאבים