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
undnew 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-gehostete Stylesheets mit „insertCSS“ in eine Webseite einfügen
- Für Erweiterungen, die
chrome.devtools
verwenden, ermöglicht inspectWindow.eval die Ausführung von JavaScript im Kontext der geprüften Seite. - Debugger-Erweiterungen können mit chrome.debugger.sendCommand JavaScript in einem Fehlerbehebungsziel ausführen.
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.
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 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"
.
{ ... "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 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.