Sicherheit von Erweiterungen verbessern

Verbesserung der 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 Erweiterungs-Service-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 Erweiterungs-Bundle.
  • Aktualisieren Sie die Script- und Stilreferenzen, um Ressourcen aus dem Erweiterungsbundle zu laden.
  • Mit chrome.runtime.getURL() können Sie Ressourcen-URLs zur Laufzeit 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. Informationen zum Aktualisieren von Anrufen finden Sie unter executeScript() verschieben.

Es gibt einige Sonderfälle, in denen das Ausführen 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.
  • Eine beliebige Bibliothek, die auf einem CDN gehostet wird
  • Gebündelte Drittanbieterbibliotheken, die dynamisch gehosteten Code abrufen.

Je nach Anwendungsfall und Grund für Remote-Hosting sind alternative Ansätze verfügbar. In diesem Abschnitt werden Ansätze beschrieben, die Sie in Betracht ziehen sollten. Wenn Sie Probleme mit Remote-gehostetem Code haben, finden Sie hier weitere Informationen.

Konfigurationsabhängige Funktionen und Logik

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

Externalisierte 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 komprimierten 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 einem Service Worker eine Bibliothek hinzufügen möchten, setzen Sie den "background.type"-Schlüssel im Manifest auf "module" und verwenden Sie eine import-Anweisung.

Externe Bibliotheken in mit Tabs eingefügten Skripts verwenden

Sie können externe Bibliotheken auch zur Laufzeit laden, indem Sie sie beim Aufrufen von scripting.executeScript() dem Array files hinzufügen. 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 Sie mehr Dynamik benötigen, können Sie mit der neuen Eigenschaft func in scripting.executeScript() eine Funktion als Inhaltsskript einfügen und mithilfe der Eigenschaft args Variablen übergeben.

Manifest V2
let name = 'World!';
chrome.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';
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() befindet sich in der Referenz für diese Funktion.

Nach anderen Problemumgehungen suchen

Wenn die vorherigen Ansätze in Ihrem Anwendungsfall nicht hilfreich sind, müssen Sie möglicherweise entweder 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 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 Service Workern.

sandbox: Alle in einer Sandbox ausgeführten Erweiterungsseiten, die von der 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: jede localhost-Quelle (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.