Sicherheit von Erweiterungen verbessern

Höhere Sicherheit in Manifest V3

Dies ist der letzte von drei Abschnitten, in denen Änderungen beschrieben werden, die für Code erforderlich sind, der nicht Teil des Service Workers der Erweiterung ist. Darin werden Änderungen beschrieben, die erforderlich sind, um die Sicherheit von Erweiterungen zu verbessern. In den beiden anderen Abschnitten geht es um das Aktualisieren des Codes, das für das Upgrade auf Manifest V3 erforderlich ist, und um das Ersetzen blockierender Webanfragen.

Ausführung beliebiger Strings entfernen

Sie können mit executeScript(), eval() und new Function() nicht mehr externe Logik ausführen.

  • Verschieben Sie den gesamten externen Code (JS, Wasm, CSS) in Ihr Erweiterungsbundle.
  • Aktualisieren Sie Skript- und Stilreferenzen, um Ressourcen aus dem Erweiterungs-Bundle zu laden.
  • Verwenden Sie browser.runtime.getURL(), um Ressourcen-URLs zur Laufzeit zu erstellen.
  • Sandbox-iFrame verwenden: eval und new Function(...) werden in Sandbox-iFrames weiterhin unterstützt. Weitere Informationen finden Sie im Leitfaden zu Sandboxed-iFrames.

Die Methode executeScript() befindet sich jetzt im Namespace scripting anstelle des Namespace tabs. Informationen zum Aktualisieren von Anrufen finden Sie unter executeScript() verschieben.

Es gibt einige Sonderfälle, in denen die Ausführung beliebiger Strings weiterhin möglich ist:

Entfernen von remote gehostetem Code

In Manifest V3 muss die gesamte Logik Ihrer Erweiterung Teil des Erweiterungspakets sein. Gemäß der Chrome Web Store-Richtlinie können Sie keine Dateien mehr laden und ausführen, die auf einem Remote-Server gehostet werden. Beispiele:

  • JavaScript-Dateien, die vom Server des Entwicklers abgerufen werden.
  • Alle Bibliotheken, die auf einem CDN gehostet werden.
  • Gebündelte Drittanbieterbibliotheken, die dynamisch remote gehosteten Code abrufen.

Je nach Anwendungsfall und Grund für das Remote-Hosting sind alternative Ansätze verfügbar. In diesem Abschnitt werden verschiedene Ansätze beschrieben. Wenn Sie Probleme mit dem Umgang mit remote gehostetem Code haben, finden Sie hier weitere Informationen.

Konfigurationsgesteuerte Funktionen und Logik

Ihre Erweiterung lädt und speichert eine Remote-Konfiguration (z. B. eine JSON-Datei) zur Laufzeit im Cache. Die im Cache gespeicherte Konfiguration bestimmt, welche Funktionen aktiviert sind.

Ausgelagerte Logik mit einem Remotedienst

Ihre Erweiterung ruft einen Remote-Webdienst auf. So können Sie Code privat halten und bei Bedarf ändern, ohne ihn noch einmal im Chrome Web Store einreichen zu müssen.

Extern gehosteten Code in ein Sandbox-iFrame einbetten

Extern gehosteter Code wird in Sandboxed-Iframes unterstützt. Diese Methode funktioniert nicht, wenn für den Code Zugriff auf das DOM der Einbettungsseite erforderlich ist.

Bibliotheken von Drittanbietern bündeln

Wenn Sie ein beliebtes Framework wie React oder Bootstrap verwenden, das Sie zuvor von einem externen Server geladen haben, können Sie die minimierten Dateien herunterladen, Ihrem Projekt hinzufügen und lokal importieren. Beispiel:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

Wenn Sie eine Bibliothek in einen Service Worker einfügen möchten, setzen Sie den "background.type"-Schlüssel im Manifest auf "module" und verwenden Sie eine import-Anweisung.

Externe Bibliotheken in Tab-Scripts verwenden

Sie können auch externe Bibliotheken zur Laufzeit laden, indem Sie sie beim Aufrufen von scripting.executeScript() dem Array files hinzufügen. Sie können Daten zur Laufzeit weiterhin remote laden.

browser.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

Funktion einfügen

Wenn Sie mehr Dynamik benötigen, können Sie mit der neuen Property func in scripting.executeScript() eine Funktion als Inhaltsscript einschleusen und Variablen mit der Property args übergeben.

Manifest V2
let name = 'World!';
browser.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

In einer Hintergrundskriptdatei.

Manifest V3
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],
});

Im Hintergrunddienst-Service-Worker.

Das Repository mit Chrome-Erweiterungsbeispielen enthält ein Beispiel für das Einfügen von Funktionen, das Sie durchgehen können. Ein Beispiel für getCurrentTab() finden Sie in der Referenz für diese Funktion.

Nach anderen Problemumgehungen suchen

Wenn die vorherigen Ansätze für Ihren Anwendungsfall nicht hilfreich sind, müssen Sie möglicherweise eine alternative Lösung finden (z.B. zu einer anderen Bibliothek migrieren) oder andere Möglichkeiten finden, die Funktionen der Bibliothek zu nutzen. Bei Google Analytics können Sie beispielsweise auf das Google Measurement Protocol umstellen, anstatt die offizielle, remote gehostete JavaScript-Version zu verwenden. Weitere Informationen finden Sie in unserem Leitfaden zu Google Analytics 4.

Content Security Policy aktualisieren

Das "content_security_policy" wurde nicht aus der Datei manifest.json entfernt, ist aber jetzt ein Dictionary, das zwei Attribute unterstützt: "extension_pages" und "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: Bezieht sich auf Kontexte in Ihrer Erweiterung, einschließlich HTML-Dateien und Service Workern.

sandbox: Bezieht sich auf alle Sandbox-Erweiterungsseiten, die von Ihrer Erweiterung verwendet werden.

Nicht unterstützte Content Security Policies entfernen

Manifest V3 lässt bestimmte Werte für die Content Security Policy im Feld "extension_pages" nicht zu, die in Manifest V2 zulässig waren. Insbesondere sind in Manifest V3 Erweiterungen verboten, die die Remote-Codeausführung ermöglichen. Die Direktiven script-src,, object-src und worker-src dürfen nur die folgenden Werte haben:

  • self
  • none
  • wasm-unsafe-eval
  • Nur entpackte Erweiterungen: beliebige localhost-Quellen (http://localhost, http://127.0.0.1 oder ein beliebiger Port in diesen Domains)

Für die Werte der Content Security Policy für sandbox gelten keine solchen neuen Einschränkungen.