תאריך פרסום: 17 בנובמבר 2025
מגרסה Chrome 141, אפשר להצטרף לניסוי המקור כדי לבדוק את התכונות החדשות של מדיניות אבטחת התוכן (CSP) ש-Chrome משיק. התכונות האלה עוזרות לאתרים להגן על עצמם מפני XSS על ידי הוספה טובה יותר של מקורות ידועים של JavaScript לרשימת ההיתרים. הוספה לרשימת ההיתרים של JavaScript ידוע וחסימה של כל המקורות האחרים היא דרך יעילה למניעת XSS. תוקף שהחדיר JavaScript לא יופיע ברשימת ההיתרים, ולכן הוא ייחסם.
בלי התכונות האלה, קשה להגדיר CSP 'מחמיר' שמאפשר להוסיף לרשימת ההיתרים את כל מקורות ה-JavaScript בלי מנגנון תקשורת של nonce בין מארח הסקריפט לבין האתר, או בלי לדעת מראש את הגיבוב המלא של הסקריפט. קשה להטמיע את שתי השיטות האלה אם הסקריפט משתנה לעיתים קרובות ומתארח על ידי צד שלישי מהימן, אבל נפרד. בנוסף, אם סקריפט כלשהו צריך להשתמש ב-eval, CSP דורש כרגע להוסיף את eval לרשימת ההיתרים של כל הסקריפטים, מה שהופך אותו לחלש יותר.
אנחנו מנסים לצמצם את הפער הזה על ידי מתן מנגנון חזק יותר להוספת סקריפטים לרשימת ההיתרים ב-script-src על סמך כתובות URL, ומנגנון להוספת קריאות ל-eval לרשימת ההיתרים. תוכלו להשתמש במנגנון הגיבוב הקיים ב-script-src כדי להוסיף לרשימת ההיתרים כתובות URL של סקריפטים ספציפיים, ו-JavaScript שמועבר לפונקציה eval (ולפונקציות אחרות שדומות ל-eval). יכול להיות שהוספה לרשימת ההיתרים על סמך כתובת URL לא מחמירה כמו CSP שמבוסס על יושרה, אבל המנגנון הזה אמור להיות שיפור משמעותי לעומת רשימת ההיתרים הקיימת של שמות המארחים.
לדעתנו, כך קל יותר לפרוס מדיניות CSP, ועדיין אפשר לצמצם באופן משמעותי את הסיכון ל-XSS על ידי חסימת סקריפטים מוטבעים וסקריפטים מסוג eval שלא אושרו. התכונות החדשות האלה תוכננו ויושמו בקפידה כדי לאפשר לאתרים להגדיר מדיניות שמספקת אבטחה משופרת בדפדפנים שתומכים בפונקציונליות החדשה, בלי לגרום לבעיות או לפגוע באבטחה בדפדפנים שלא תומכים בה, ובלי לבצע זיהוי של סוכן המשתמש.
תרחישים לדוגמה
הוספת כתובות URL ספציפיות לרשימת ההיתרים לשימוש ב-script-src
לאתרים שרוצים להוסיף לרשימת ההיתרים סקריפטים ספציפיים לשימוש עם script-src יש כרגע שתי אפשרויות: להוסיף לרשימת ההיתרים את תוכן הסקריפטים באמצעות בדיקת תקינות של משאבי משנה (SRI), או להשתמש ב-host-source כדי להוסיף לרשימת ההיתרים שמות מארחים. בדרך כלל, השימוש ב-SRI לא פרקטי לסקריפטים שמשתנים לעיתים קרובות (לדוגמה, סקריפטים של ניתוח נתונים). אם מגדירים גם את strict-dynamic, המערכת מתעלמת מההגדרה host-source. ההגדרה הזו לא מספקת הגנה מקיפה כי היא לא כוללת פרמטרים של כתובות URL. השינוי הזה יאפשר להוסיף לרשימת ההיתרים סקריפטים באמצעות גיבוב של כתובת ה-URL (המלאה) שלהם, ויכלול תמיכה בסקריפטים דינמיים ובהגדרות שמשתמשות ב-strict-dynamic.
הוספה לרשימת ההיתרים של סקריפטים ספציפיים לשימוש בפונקציות eval או בפונקציות דומות
יש אתרים שנדרש בהם שימוש בפונקציות eval או בפונקציות דומות (העברת קוד כמחרוזות מילוליות ב-setTimeout, ב-setInterval וב-setImmediate). באתרים האלה, האפשרות היחידה של CSP שזמינה היא unsafe-eval, שמאפשרת את כל הקריאות לפונקציה eval. אנחנו מוסיפים מנגנון להוספת קלט ספציפי לרשימת ההיתרים של הפונקציה eval. המנגנון החדש הזה מאפשר להוסיף לרשימת ההיתרים רק את הסקריפטים הספציפיים שנדרשים, על ידי גיבוב התוכן של הסקריפט ישירות, במקום להשתמש ב-CSP רחב מדי של unsafe-eval.
שנתחיל?
כדי לנסות את התמיכה בגיבוב של סקריפטים ופונקציות eval, אפשר להצטרף לגרסת המקור לניסיון של
URL and eval hashes in CSP script-src, שפועלת מגרסה Chrome 141 עד 144.
הוספת האש ל-script-src
כדי להוסיף כתובות URL לרשימת ההיתרים, מוסיפים ערך להנחיית CSP של script-src בפורמט url-<hash-algorithm>-<script-url-hash>. כך יתאפשר להפעיל את כל התוכן שמוצג בכתובת ה-URL הזו, בלי קשר לתוכן. הגיבוב צריך לכלול רק את כתובת ה-URL הראשונית (כתובת ה-URL שמופיעה בדף), ולא כתובת URL שהכתובת הראשונית מפנה אליה. יש תמיכה בכתובות URL מוחלטות ויחסיות.
לדוגמה, כותרת ה-CSP הבאה תאפשר את הסקריפט שמוצג בכתובת https://example.com/example.js:
Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';
כאשר 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' הוא גיבוב sha256 של https://example.com/example.js.
אפשר להוסיף סקריפטים שמוערכים באמצעות eval או new Function לרשימת ההיתרים על ידי הוספת eval-<hash-algorithm>-<script-contents-hash> ל-script src. לדוגמה, כותרת ה-CSP הבאה תאפשר העברה של המחרוזת alert("hello world") אל eval():
Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';
כאשר 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' הוא גיבוב sha256 של alert("hello world").
כדי לעזור בהטמעה, כשאתר מצטרף לניסוי המקור, הגיבובים של כתובות ה-URL ושל eval מודפסים במסוף כלי הפיתוח ונכללים בדוחות CSP. כלומר, אפשר להשתמש במדיניות מחמירה, אבל report-only, כדי למנות את כל הגיבובים שנדרשים להוספה לרשימת ההיתרים.
שמירה על תאימות לאחור
כדי לאפשר פריסה של המדיניות הזו לפני שכל הדפדפנים יוסיפו תמיכה, אפשר לכלול גיבובים של כתובות URL אחרי רשימות ההיתרים שמבוססות על מארחים. דפדפנים שמבינים את סוגי הגיבוב החדשים יתעלמו מרשימות ההיתרים הקודמות שמבוססות על מארחים, בעוד שדפדפנים שלא מבינים את סוגי הגיבוב החדשים עדיין יאכפו את רשימת ההיתרים שמבוססת על מארחים, ויאפשרו לאתרים להגדיר את שתי הרשימות. כך, בדפדפנים שתומכים בכך, המדיניות המחמירה יותר תיאכף, בלי להסתכן בשיבושים בדפדפנים שלא תומכים בכך, כמו שמוצג בדוגמה הבאה.
Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
הוספנו גם את strict-dynamic-url, ששווה ל-strict-dynamic אבל חל רק כשמוגדרים גיבובים של כתובות URL. מכיוון שהמדיניות strict-dynamic גורמת להתעלמות מרשימות היתרים שמבוססות על מארח, אתר שרוצה להוסיף לרשימת ההיתרים גיבוב ספציפי ולהחיל עליו את המדיניות strict-dynamic יכול להשתמש במדיניות כמו:
Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
בדוגמה הזו, דפדפנים שעדיין לא תומכים בגיבוב יאכפו רק את https:. באופן דומה, דפדפנים תומכים יתעלמו מ-unsafe-eval אם יש גיבובים של eval. לדוגמה, המדיניות הבאה תוערך כ-unsafe-eval. ההגדרה הזו מאפשרת שימוש בכל eval() בדפדפנים שעדיין לא תומכים בגיבוב eval, ומאפשרת רק את eval() של alert("hello world") בדפדפנים שתומכים בגיבוב eval.
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
שיתוף משוב
נשמח לקבל משוב ממפתחים על התוספים האלה לכתובת script-src. אפשר לפרסם הערות כבעיה בהסבר ב-GitHub.