שיפור האבטחה ב-Manifest V3
זהו הקטע האחרון מתוך שלושה שמתארים את השינויים שצריך לבצע בקוד שלא שייך ל-service worker של התוסף. במאמר מוסבר על השינויים שנדרשים כדי לשפר את האבטחה של התוספים. שני הקטעים האחרים עוסקים בעדכון הקוד שנדרש לשדרוג ל-Manifest V3 ובהחלפת בקשות אינטרנט חוסמות.
הסרה של הרצת מחרוזות אקראיות
אי אפשר יותר להפעיל לוגיקה חיצונית באמצעות executeScript(), eval() ו-new Function().
- מעבירים את כל הקוד החיצוני (JS, Wasm, CSS) לחבילת התוסף.
- מעדכנים את ההפניות לסקריפט ולסגנון כדי לטעון משאבים מחבילת התוסף.
- משתמשים ב-
browser.runtime.getURL()כדי ליצור כתובות URL של משאבים בזמן ריצה. - שימוש ב-iframe בארגז חול: עדיין יש תמיכה בתגי
evalו-new Function(...)ב-iframes בארגז חול. פרטים נוספים זמינים במדריך בנושא iframes עם ארגז חול.
ה-method executeScript() נמצא עכשיו במרחב השמות scripting ולא במרחב השמות tabs. מידע על עדכון שיחות זמין במאמר העברת executeScript().
יש כמה מקרים מיוחדים שבהם עדיין אפשר להריץ מחרוזות שרירותיות:
- הוספת גיליונות סגנונות שמתארחים מרחוק לדף אינטרנט באמצעות insertCSS
- לתוספים שמשתמשים ב-
browser.devtools: הפונקציה inspectWindow.eval מאפשרת להריץ JavaScript בהקשר של הדף שנבדק. - תוספי ניפוי באגים יכולים להשתמש ב-browser.debugger.sendCommand כדי להריץ JavaScript ביעד ניפוי באגים.
הסרה של קוד שמתארח מרחוק
ב-Manifest V3, כל הלוגיקה של התוסף חייבת להיות חלק מחבילת התוסף. אי אפשר יותר לטעון ולהפעיל קבצים שמתארחים מרחוק בהתאם למדיניות של חנות האינטרנט של Chrome. דוגמאות:
- קבצי JavaScript שנמשכו מהשרת של המפתח.
- כל ספרייה שמתארחת ב-CDN.
- ספריות של צד שלישי שמאגדות קוד שמתארח מרחוק ומאוחזר באופן דינמי.
יש גישות חלופיות, בהתאם לתרחיש השימוש ולסיבה לאירוח מרחוק. בקטע הזה מתוארות גישות שכדאי לשקול. אם אתם נתקלים בבעיות בטיפול בקוד שמתארח מרחוק, יש לנו הנחיות שיכולות לעזור.
תכונות ולוגיקה שמבוססות על הגדרות
התוסף שלכם טוען ומאחסן במטמון הגדרה מרוחקת (לדוגמה, קובץ JSON) בזמן הריצה. ההגדרה ששמורה במטמון קובעת אילו תכונות מופעלות.
לוגיקה חיצונית עם שירות מרוחק
התוסף שולח קריאה לשירות אינטרנט מרוחק. כך תוכלו לשמור על קוד פרטי ולשנות אותו לפי הצורך, בלי להגיש אותו מחדש לחנות האינטרנט של Chrome.
הטמעה של קוד באירוח מרוחק ב-iframe שבארגז חול (sandbox)
יש תמיכה בקוד באירוח מרוחק בפריטי iframe שבארגז חול (sandbox). חשוב לזכור שהגישה הזו לא תעבוד אם הקוד דורש גישה ל-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(). עדיין אפשר לטעון נתונים מרחוק בזמן הריצה.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
הוספת פונקציה
אם אתם צריכים יותר דינמיות, המאפיין החדש func ב-scripting.executeScript() מאפשר לכם להוסיף פונקציה כסקריפט תוכן ולהעביר משתנים באמצעות המאפיין args.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
בקובץ של סקריפט ברקע.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; browser.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
בקובץ ה-service worker ברקע.
מאגר הדוגמאות של תוספים ל-Chrome כולל דוגמה להחדרת פונקציה שאפשר לעבור עליה שלב אחר שלב. דוגמה לשימוש בפונקציה getCurrentTab() מופיעה בהפניה לפונקציה הזו.
חיפוש פתרונות עקיפים אחרים
אם הגישות הקודמות לא עוזרות לכם במקרה השימוש שלכם, יכול להיות שתצטרכו למצוא פתרון חלופי (כלומר, לעבור לספרייה אחרת) או למצוא דרכים אחרות להשתמש בפונקציונליות של הספרייה. לדוגמה, במקרה של Google Analytics, אפשר לעבור ל-Google Measurement Protocol במקום להשתמש בגרסת 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 ועובדי שירות.
sandbox: מתייחס לכל דפי התוסף בארגז חול שהתוסף שלכם משתמש בהם.
הסרה של מדיניות אבטחת תוכן שלא נתמכת
ב-Manifest V3 אסור להשתמש בערכים מסוימים של מדיניות אבטחת התוכן בשדה "extension_pages", שהיו מותרים ב-Manifest V2. במיוחד, Manifest V3 אוסר על תוספים שמאפשרים הרצת קוד מרחוק. ההוראות script-src, object-src ו-worker-src יכולות לקבל רק את הערכים הבאים:
selfnonewasm-unsafe-eval- תוספים לא ארוזים בלבד: כל מקור localhost (
http://localhost,http://127.0.0.1או כל יציאה בדומיינים האלה)
ערכי מדיניות אבטחת התוכן של sandbox לא כוללים הגבלות חדשות כאלה.