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

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

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

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

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

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

מניפסט מגרסה 2
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".

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

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

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

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

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

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

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