Sicherheit von Erweiterungen verbessern

Verbesserte Sicherheit in Manifest V3

Dies ist der letzte von drei Abschnitten, in denen Änderungen für Code beschrieben werden, der nicht Teil des Erweiterungs-Dienst-Workers ist. Darin werden Änderungen beschrieben, die zur Verbesserung der Sicherheit von Erweiterungen erforderlich sind. In den anderen beiden Abschnitten geht es um das Aktualisieren Ihres Codes, das für die Umstellung 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() keine externe Logik mehr ausführen.

  • Verschieben Sie den gesamten externen Code (JS, Wasm, CSS) in Ihr Erweiterungsbundle.
  • Aktualisieren Sie die Script- und Stilreferenzen, um Ressourcen aus dem Erweiterungsbundle zu laden.
  • Verwenden Sie chrome.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 Sandbox-Iframes.

Die executeScript()-Methode befindet sich jetzt im Namespace scripting und nicht mehr im Namespace tabs. Weitere Informationen zum Aktualisieren von Aufrufen finden Sie unter executeScript() verschieben.

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

Ferngehosteten Code entfernen

In Manifest V3 muss die gesamte Logik Ihrer Erweiterung Teil des Erweiterungspakets sein. Gemäß den Chrome Web Store-Richtlinien können Sie nicht mehr per Remote gehostete Dateien laden und ausführen. Beispiele:

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

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

Konfigurationsabhängige Funktionen und Logik

Ihre Erweiterung lädt eine Remotekonfiguration (z. B. eine JSON-Datei) zur Laufzeit und speichert sie im Cache. Anhand der im Cache gespeicherten Konfiguration wird festgelegt, welche Funktionen aktiviert sind.

Externe Logik mit einem Remote-Dienst

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

Extern gehosteten Code in einen Sandbox-iFrame einbetten

Extern gehosteter Code wird in iFrames mit Sandbox unterstützt. Hinweis: Dieser Ansatz funktioniert nicht, wenn der Code Zugriff auf das DOM der Einbettungsseite benötigt.

Drittanbieterbibliotheken in Bundles verpacken

Wenn Sie ein gängiges 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 einbinden möchten, legen Sie im Manifest den Schlüssel "background.type" auf "module" fest und verwenden Sie eine import-Anweisung.

Externe Bibliotheken in Tabs einschleusen

Sie können externe Bibliotheken auch während der Laufzeit laden, indem Sie sie dem files-Array hinzufügen, wenn Sie scripting.executeScript() aufrufen. Sie können Daten aber weiterhin zur Laufzeit aus der Ferne laden.

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

Funktion einfügen

Wenn du mehr Dynamik benötigst, kannst du mit der neuen Property func in scripting.executeScript() eine Funktion als Inhaltsskript einfügen und Variablen mithilfe der Property args übergeben.

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

In einer Hintergrund-Scriptdatei

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

Im Hintergrund-Dienst-Worker.

Das Repository mit Beispielen für Chrome-Erweiterungen enthält ein Beispiel für die Funktionsinjection, das Sie Schritt für Schritt 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 zur Nutzung der Bibliotheksfunktionen finden. Bei Google Analytics können Sie beispielsweise zum Google Measurement Protocol wechseln, anstatt die offizielle, aus der Ferne gehostete JavaScript-Version zu verwenden, wie in unserem Google Analytics 4-Leitfaden beschrieben.

Content Security Policy aktualisieren

"content_security_policy" wurde nicht aus der manifest.json-Datei entfernt, ist aber jetzt ein Wörterbuch, das zwei Eigenschaften 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 Dienst-Workern.

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

Nicht unterstützte Content Security Policies entfernen

In Manifest V3 sind bestimmte Werte für Inhaltssicherheitsrichtlinien im Feld "extension_pages" nicht zulässig, die in Manifest V2 erlaubt waren. Insbesondere sind in Manifest V3 solche nicht zulässig, die die Remote-Codeausführung ermöglichen. Die Anweisungen script-src,, object-src und worker-src dürfen nur die folgenden Werte haben:

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

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