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:
evalundnew 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:
- Remote gehostete Stylesheets mit „insertCSS“ in eine Webseite einfügen
- Für Erweiterungen, die
browser.devtoolsverwenden: Mit inspectWindow.eval kann JavaScript im Kontext der untersuchten Seite ausgeführt werden. - Debugger-Erweiterungen können browser.debugger.sendCommand verwenden, um JavaScript in einem Debugging-Ziel auszuführen.
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.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
In einer Hintergrundskriptdatei.
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".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "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:
selfnonewasm-unsafe-eval- Nur entpackte Erweiterungen: beliebige localhost-Quellen (
http://localhost,http://127.0.0.1oder ein beliebiger Port in diesen Domains)
Für die Werte der Content Security Policy für sandbox gelten keine solchen neuen Einschränkungen.