שיפור אבטחת התוסף

שיפור האבטחה במניפסט מגרסה V3

זהו החלק האחרון מתוך שלושה סעיפים שמתארים את השינויים הנדרשים בקוד שאינו חלק מ-service worker. במאמר מתוארים השינויים הנדרשים לשיפור האבטחה של התוספים. בשני הקטעים האחרים מוסבר על עדכון הקוד הנדרש לשדרוג ל-Manifest V3 ועל החלפת בקשות חסימה באינטרנט.

הסרה של ביצוע מחרוזות שרירותיות

אין לך יותר אפשרות להפעיל לוגיקה חיצונית באמצעות executeScript(), eval() ו-new Function().

  • צריך להעביר את כל הקוד החיצוני (JS, Wasm, CSS) אל חבילת התוספים.
  • מעדכנים את ההפניות לסקריפטים ולסגנונות כדי לטעון משאבים מחבילת התוספים.
  • כדי ליצור כתובות URL של משאבים בזמן ריצה, משתמשים ב-chrome.runtime.getURL().
  • שימוש ב-iframe בתוך ארגז חול: עדיין יש תמיכה ב-eval וב-new Function(...) במסגרות iframe בתוך ארגז חול. לפרטים נוספים, ניתן לקרוא את המדריך בנושא iframes בארגז חול (sandbox).

השיטה executeScript() נמצאת עכשיו במרחב השמות scripting במקום במרחב השמות tabs. למידע על עדכון השיחות, אפשר להיעזר בהעברת executeScript().

יש מספר מקרים מיוחדים שבהם עדיין ניתן להפעיל מחרוזות שרירותיות:

הסרת הקוד שבאירוח מרוחק

במניפסט מגרסה V3, כל הלוגיקה של התוסף חייבת להיות חלק מחבילת התוספים. לא ניתן יותר לטעון ולבצע קבצים שמתארחים מרחוק, בהתאם למדיניות של חנות האינטרנט של Chrome. דוגמאות:

  • קובצי JavaScript שנשלפו מהשרת של המפתח.
  • כל ספרייה שמתארחת ב-CDN.
  • ספריות מקובצות של צד שלישי שמאחזרות באופן דינמי קוד באירוח מרוחק.

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

תכונות ולוגיקה מבוססות-הגדרה

התוסף טוען ושומר במטמון תצורה מרחוק (למשל קובץ JSON) בזמן הריצה. ההגדרה של המטמון קובעת אילו תכונות יופעלו.

לוגיקה חיצונית באמצעות שירות מרוחק

התוסף מפעיל שירות אינטרנט מרוחק. כך תוכלו לשמור על הפרטיות של הקוד ולשנות אותו לפי הצורך, בלי העלויות הנוספות של שליחת הקוד מחדש לחנות האינטרנט של Chrome.

הטמעת קוד שמתארח מרחוק ב-iframe שבארגז חול (sandbox)

יש תמיכה בקוד שמתארח מרחוק ברכיבי iframe ב-sandbox. שימו לב שגישה זו לא פועלת אם הקוד דורש גישה ל-DOM של דף ההטמעה.

איך מחברים ספריות של צד שלישי לחבילה

אם אתם משתמשים ב-framework פופולרי כמו 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.

מניפסט מגרסה V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

בקובץ סקריפט ברקע.

מניפסט V3
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, אפשר לעבור ל-Google Measurement Protocol במקום להשתמש בגרסת ה-JavaScript הרשמית באירוח מרוחק, כפי שמתואר במדריך Google Analytics 4.

עדכון מדיניות האבטחה של התוכן

ה-"content_security_policy" לא הוסר מהקובץ manifest.json, אבל עכשיו הוא מילון שתומך בשני מאפיינים: "extension_pages" ו-"sandbox".

מניפסט מגרסה V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
מניפסט V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: מתייחס להקשרים בתוסף, כולל קובצי HTML ושירותי עבודה.

sandbox: מתייחס לכל דפי התוסף שנמצאים בארגז החול שבהם התוסף משתמש.

הסרת מדיניות אבטחת תוכן שלא נתמכת

במניפסט מגרסה V3 נאסר שימוש בערכים מסוימים של מדיניות אבטחת תוכן בשדה "extension_pages" שהותרו במניפסט מגרסה V2. באופן ספציפי, קובץ Manifest V3 מונע הפעלה של קוד מרחוק. ההנחיות script-src,, object-src ו-worker-src יכולות לקבל רק את הערכים הבאים:

  • self
  • none
  • wasm-unsafe-eval
  • תוספים לא מוצקים בלבד: כל מקור של localhost‏ (http://localhost,‏ http://127.0.0.1 או כל יציאה בדומיינים האלה)

לערכים של מדיניות אבטחת התוכן עבור sandbox אין הגבלות חדשות כאלה.