שיפור האבטחה ב-Manifest V3
זהו הקטע האחרון מתוך שלושה שמתארים את השינויים שצריך לבצע בקוד שלא שייך ל-service worker של התוסף. במאמר הזה מתוארים השינויים שנדרשים כדי לשפר את האבטחה של התוספים. שני הקטעים האחרים עוסקים בעדכון הקוד שנדרש לשדרוג ל-Manifest V3 ובהחלפת בקשות אינטרנט חוסמות.
הסרה של הרצה של מחרוזות אקראיות
אי אפשר יותר להפעיל לוגיקה חיצונית באמצעות executeScript(), eval() ו-new Function().
- מעבירים את כל הקוד החיצוני (JS, Wasm, CSS) לחבילת התוסף.
- מעדכנים את ההפניות לסקריפט ולסגנון כדי לטעון משאבים מחבילת התוסף.
- משתמשים ב-
chrome.runtime.getURL()כדי ליצור כתובות URL של משאבים בזמן ריצה. - שימוש ב-sandboxed iframe: עדיין יש תמיכה ב-
evalוב-new Function(...)ב-sandboxed iframe. פרטים נוספים זמינים במדריך בנושא iframes עם ארגז חול.
ה-method executeScript() נמצא עכשיו במרחב השמות scripting ולא במרחב השמות tabs. מידע על עדכון שיחות זמין במאמר העברה executeScript().
יש כמה מקרים מיוחדים שבהם עדיין אפשר להריץ מחרוזות שרירותיות:
- החדרת גיליונות סגנונות שמתארחים מרחוק לדף אינטרנט באמצעות insertCSS
- לתוספים שמשתמשים ב-
chrome.devtools: הפונקציה inspectWindow.eval מאפשרת להריץ JavaScript בהקשר של הדף שנבדק. - תוספי ניפוי באגים יכולים להשתמש ב-chrome.debugger.sendCommand כדי להריץ JavaScript ביעד ניפוי באגים.
הסרה של קוד שמתארח מרחוק
ב-Manifest V3, כל הלוגיקה של התוסף חייבת להיות חלק מחבילת התוסף. אי אפשר יותר לטעון ולהפעיל קבצים שמתארחים מרחוק בהתאם למדיניות של חנות האינטרנט של Chrome. דוגמאות:
- קבצי JavaScript שנמשכים מהשרת של המפתח.
- כל ספרייה שמתארחת ב-CDN.
- ספריות של צד שלישי שמאגדות קוד שמתארח מרחוק ונשלף באופן דינמי.
יש גישות חלופיות, בהתאם לתרחיש השימוש ולסיבה לאירוח מרחוק. בקטע הזה מתוארות גישות שכדאי לשקול. אם נתקלתם בבעיות בטיפול בקוד שמתארח מרחוק, יש לנו הנחיות שיעזרו לכם.
תכונות ולוגיקה שמבוססות על הגדרות
התוסף שלכם טוען ומאחסן במטמון הגדרה מרוחקת (לדוגמה, קובץ JSON) בזמן הריצה. התצורה ששמורה במטמון קובעת אילו תכונות מופעלות.
לוגיקה חיצונית עם שירות מרוחק
התוסף שלכם קורא לשירות אינטרנט מרוחק. כך אפשר לשמור על קוד פרטי ולשנות אותו לפי הצורך, בלי להגיש אותו מחדש לחנות האינטרנט של Chrome.
הטמעה של קוד באירוח מרוחק ב-sandboxed iframe
יש תמיכה בקוד באירוח מרוחק ב-sandboxed iframes. חשוב לזכור שהגישה הזו לא תעבוד אם הקוד דורש גישה ל-DOM של הדף שבו הוא מוטמע.
חבילה של ספריות צד שלישי
אם אתם משתמשים במסגרת פופולרית כמו React או Bootstrap, שטענתם בעבר משרת חיצוני, אתם יכולים להוריד את הקבצים הממוזערים, להוסיף אותם לפרויקט ולייבא אותם באופן מקומי. לדוגמה:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
כדי לכלול ספרייה ב-service worker, צריך להגדיר את המפתח "background.type" לערך "module" במניפסט ולהשתמש בהצהרת import.
שימוש בספריות חיצוניות בסקריפטים שמוזרקים לכרטיסיות
אפשר גם לטעון ספריות חיצוניות בזמן הריצה על ידי הוספתן למערך files כשקוראים ל-scripting.executeScript(). עדיין אפשר לטעון נתונים מרחוק בזמן הריצה.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
הוספת פונקציה
אם אתם צריכים יותר דינמיות, המאפיין החדש func ב-scripting.executeScript() מאפשר לכם להחדיר פונקציה כסקריפט תוכן ולהעביר משתנים באמצעות המאפיין args.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
בקובץ סקריפט רקע.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; chrome.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
ברקע, מתבצעת עבודה של Service Worker.
מאגר הדוגמאות של תוספים ל-Chrome כולל דוגמה להחדרת פונקציה שאפשר לעבור עליה שלב אחר שלב. דוגמה לשימוש בפונקציה getCurrentTab() מופיעה בהפניה לפונקציה הזו.
חיפוש פתרונות חלופיים אחרים
אם הגישות הקודמות לא עוזרות לכם במקרה השימוש שלכם, יכול להיות שתצטרכו למצוא פתרון חלופי (כלומר, לעבור לספרייה אחרת) או למצוא דרכים אחרות להשתמש בפונקציונליות של הספרייה. לדוגמה, במקרה של Google Analytics, אפשר לעבור ל-Measurement Protocol של Google במקום להשתמש בגרסת JavaScript הרשמית שמתארחת מרחוק, כפי שמתואר במדריך ל-Google Analytics 4.
עדכון מדיניות אבטחת התוכן
ה-"content_security_policy" לא הוסר מהקובץ manifest.json, אבל עכשיו הוא מילון שתומך בשני מאפיינים: "extension_pages" ו-"sandbox".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: מתייחס להקשרים בתוסף, כולל קובצי HTML ו-service workers.
sandbox: מתייחס לכל דפי התוסף בסביבת ארגז חול שבהם התוסף משתמש.
הסרת מדיניות אבטחת תוכן שלא נתמכת
במניפסט מגרסה V3 אסור להשתמש בערכים מסוימים של מדיניות אבטחת תוכן בשדה "extension_pages", שהיו מותרים במניפסט מגרסה V2. במיוחד, ב-Manifest V3 אסור להשתמש בתוספים שמאפשרים הרצת קוד מרחוק. ההוראות script-src, object-src ו-worker-src יכולות לקבל רק את הערכים הבאים:
selfnonewasm-unsafe-eval- תוספים לא ארוזים בלבד: כל מקור localhost (
http://localhost,http://127.0.0.1או כל יציאה בדומיינים האלה)
לערכים של מדיניות אבטחת התוכן (CSP) עבור sandbox אין הגבלות חדשות כאלה.