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
undnew 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:
- Mit insertCSS extern gehostete Stylesheets in eine Webseite einfügen
- Für Erweiterungen, die
chrome.devtools
verwenden: Mit inspectWindow.eval kann JavaScript im Kontext der geprüften Seite ausgeführt werden. - Debugger-Erweiterungen können chrome.debugger.sendCommand verwenden, um JavaScript in einem Debug-Ziel auszuführen.
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.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
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], });
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"
.
{ ... "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 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.