Sicherheit von Erweiterungen verbessern

Sicherheit in Manifest V3 verbessern

Dies ist der letzte der drei Abschnitte, in denen Änderungen beschrieben werden, die für Code erforderlich sind, der nicht Teil des Extension Service Workers ist. Darin 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 für das Upgrade auf Manifest V3 und das Ersetzen von blockierenden 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 Skript- und Stilverweise, um Ressourcen aus dem Erweiterungs-Bundle zu laden.
  • Verwenden Sie chrome.runtime.getURL(), um Ressourcen-URLs zur Laufzeit zu erstellen.
  • iFrames in einer Sandbox verwenden: eval und new Function(...) werden in iFrames in einer Sandbox weiterhin unterstützt. Weitere Informationen finden Sie im Leitfaden zu iFrames in einer Sandbox.

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

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

Remote gehosteten Code entfernen

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

  • JavaScript-Dateien, die vom Entwicklerserver abgerufen werden
  • Jede auf einem CDN gehostete Bibliothek.
  • Gebündelte Bibliotheken von Drittanbietern, die extern gehosteter Code dynamisch abrufen

Je nach Anwendungsfall und Grund für Remote-Hosting stehen alternative Ansätze zur Verfügung. In diesem Abschnitt werden die möglichen Ansätze beschrieben. Falls Sie Probleme mit Remote-Host-Code haben, finden Sie hier entsprechende Informationen.

Konfigurationsbasierte Funktionen und Logik

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

Externalisierte Logik mit einem Remote-Dienst

Ihre Erweiterung ruft einen Remote-Webdienst auf. Auf diese Weise können Sie den Code geheim halten und bei Bedarf ändern, während Sie den zusätzlichen Aufwand vermeiden, der erneut an den Chrome Web Store gesendet werden muss.

Remote gehosteten Code in einen Sandbox-iFrame einbetten

Remote gehosteter Code wird in Sandbox-iFrames unterstützt. Beachten Sie, dass diese Methode nicht funktioniert, wenn der Code Zugriff auf das DOM der Einbettungsseite erfordert.

Drittanbieterbibliotheken 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 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 eine Bibliothek in einen Service Worker aufnehmen möchten, setzen Sie den Schlüssel "background.type" im Manifest auf "module" und verwenden Sie eine import-Anweisung.

Externe Bibliotheken in Skripts mit Tab-Injektion verwenden

Sie können externe Bibliotheken auch zur Laufzeit laden, indem Sie sie dem files-Array hinzufügen, wenn Sie scripting.executeScript() aufrufen. Sie können Daten zur Laufzeit weiterhin per Fernzugriff 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 func-Eigenschaft in scripting.executeScript() eine Funktion als Inhaltsskript einfügen und Variablen mithilfe der args-Eigenschaft ü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 Repository mit Beispielen für Chrome-Erweiterungen enthält ein Beispiel für das Einfügen einer Funktion, das Sie Schritt für Schritt durchgehen können. Ein Beispiel für getCurrentTab() finden Sie in der Referenz für diese Funktion.

Suchen Sie nach anderen Behelfslösungen.

Wenn die vorherigen Ansätze bei Ihrem Anwendungsfall nicht helfen, müssen Sie entweder nach einer alternativen Lösung suchen (z.B. zu einer anderen Bibliothek migrieren) oder nach anderen Möglichkeiten suchen, die Funktionen der Bibliothek zu nutzen. Im Fall von Google Analytics können Sie beispielsweise zum Google Measurement Protocol wechseln, anstatt die offizielle, remote gehostete JavaScript-Version zu verwenden, wie in unserem Leitfaden für Google Analytics 4 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 Worker.

sandbox: Bezieht sich auf alle in einer Sandbox ausgeführten Erweiterungsseiten, die von Ihrer Erweiterung verwendet werden.

Nicht unterstützte Content-Sicherheitsrichtlinien entfernen

Bei Manifest V3 sind bestimmte Werte der Content Security Policy im Feld „"extension_pages"“ nicht zulässig, die in Manifest V2 zulässig waren. Insbesondere sind mit Manifest V3 diejenigen unzulässig, die die Remote-Ausführung von Code zulassen. Die Anweisungen script-src, object-src und worker-src dürfen nur die folgenden Werte haben:

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

Für die Content Security Policy-Werte für sandbox gibt es keine neuen Einschränkungen.