Sicherheit von Erweiterungen verbessern

Sicherheit in Manifest V3 verbessern

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

Ausführung beliebiger Strings entfernen

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

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

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

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

Extern gehosteten Code entfernen

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

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

Je nach Anwendungsfall und Grund für das externe Hosting sind alternative Ansätze verfügbar. In diesem Abschnitt werden einige Ansätze beschrieben. Wenn Sie Probleme mit extern gehostetem Code haben, finden Sie hier eine Anleitung.

Konfigurationsgesteuerte Funktionen und Logik

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

Ausgelagerte Logik mit einem Remote-Dienst

Ihre Erweiterung ruft einen externen Webdienst auf. So können Sie Code privat halten und nach Bedarf ändern, ohne den zusätzlichen Aufwand für die erneute Einreichung im Chrome Web Store zu haben.

Extern gehosteten Code in einen in einer Sandbox ausgeführten iFrame einbetten

Extern gehosteter Code wird in in einer Sandbox ausgeführten iFrames unterstützt. Dieser Ansatz funktioniert jedoch nicht, wenn der Code Zugriff auf das DOM der Einbettungsseite benötigt.

Bibliotheken von Drittanbietern bündeln

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, sie 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 auf "module" im Manifest und verwenden Sie eine import Anweisung.

Externe Bibliotheken in Skripts verwenden, die in Tabs eingefügt werden

Sie können externe Bibliotheken auch zur Laufzeit laden, indem Sie sie beim Aufrufen von scripting.executeScript() dem files Array hinzufügen. Sie können Daten weiterhin zur Laufzeit extern 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 Content-Skript einschleusen und mit 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-Service Worker.

Das Chrome-Erweiterungsbeispiel-Repository 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 Behelfslösungen suchen

Wenn die vorherigen Ansätze für Ihren Anwendungsfall nicht hilfreich sind, müssen Sie 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-Messprotokoll wechseln, anstatt die offizielle extern gehostete JavaScript-Version zu verwenden, wie in unserem Google Analytics 4-Leitfaden beschrieben.

Content Security Policy aktualisieren

Die "content_security_policy" wurde nicht aus der Datei manifest.json 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: Bezieht sich auf alle in einer Sandbox ausgeführten Erweiterungsseiten, die von Ihrer Erweiterung verwendet werden.

Nicht unterstützte Content Security Policies entfernen

In Manifest V3 sind bestimmte Content Security Policy-Werte im "extension_pages" Feld nicht zulässig, die in Manifest V2 zulässig waren. Insbesondere sind in Manifest V3 Werte nicht zulässig, die die Ausführung von Remotecode ermöglichen. Die Anweisungen script-src, object-src und worker-src dürfen nur die folgenden Werte haben:

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

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