Verbetering van de beveiliging in Manifest V3
Dit is de laatste van drie secties waarin de wijzigingen worden beschreven die nodig zijn voor code die geen deel uitmaakt van de uitbreidingsservicemedewerker. Het beschrijft de wijzigingen die nodig zijn om de beveiliging van extensies te verbeteren. De andere twee secties behandelen het bijwerken van de code die nodig is voor het upgraden naar Manifest V3 en het vervangen van blokkerende webverzoeken .
Verwijder de uitvoering van willekeurige tekenreeksen
U kunt niet langer externe logica uitvoeren met executeScript()
, eval()
en new Function()
.
- Verplaats alle externe code (JS, Wasm, CSS) naar uw extensiebundel.
- Update script- en stijlreferenties om bronnen uit de extensiebundel te laden.
- Gebruik
chrome.runtime.getURL()
om tijdens runtime bron-URL's te maken. - Gebruik een iframe in een sandbox:
eval
ennew Function(...)
worden nog steeds ondersteund in iframes in een sandbox. Lees voor meer details de handleiding over iframes in een sandbox .
De methode executeScript()
bevindt zich nu in de scripting
in plaats van in de tabs
. Zie Move executeScript()
voor informatie over het bijwerken van aanroepen.
Er zijn een paar speciale gevallen waarin het uitvoeren van willekeurige strings nog steeds mogelijk is:
- Injecteer op afstand gehoste stylesheets in een webpagina met behulp van insertCSS
- Voor extensies die
chrome.devtools
gebruiken: inspectWindow.eval maakt het uitvoeren van JavaScript mogelijk in de context van de geïnspecteerde pagina. - Debugger-extensies kunnen chrome.debugger.sendCommand gebruiken om JavaScript uit te voeren in een foutopsporingsdoel.
Verwijder op afstand gehoste code
In Manifest V3 moet alle logica van uw extensie deel uitmaken van het extensiepakket. U kunt niet langer op afstand gehoste bestanden laden en uitvoeren volgens het beleid van de Chrome Web Store . Voorbeelden zijn onder meer:
- JavaScript-bestanden opgehaald van de server van de ontwikkelaar.
- Elke bibliotheek die op een CDN wordt gehost.
- Gebundelde bibliotheken van derden die op afstand gehoste code dynamisch ophalen.
Er zijn alternatieve benaderingen beschikbaar, afhankelijk van uw gebruiksscenario en de reden voor externe hosting. In dit gedeelte worden de te overwegen benaderingen beschreven. Als u problemen ondervindt bij het omgaan met op afstand gehoste code, hebben wij begeleiding beschikbaar .
Configuratiegestuurde functies en logica
Uw extensie laadt tijdens runtime een externe configuratie (bijvoorbeeld een JSON-bestand) en slaat deze op in de cache. De configuratie in de cache bepaalt welke functies zijn ingeschakeld.
Externe logica met een service op afstand
Uw toestel belt een externe webservice. Hierdoor kunt u de code privé houden en indien nodig wijzigen, terwijl u de extra overhead vermijdt die gepaard gaat met het opnieuw indienen bij de Chrome Web Store.
Sluit op afstand gehoste code in een iframe in een sandbox
Op afstand gehoste code wordt ondersteund in iframes in een sandbox . Houd er rekening mee dat deze aanpak niet werkt als de code toegang vereist tot de DOM van de insluitingspagina.
Bundel bibliotheken van derden
Als u een populair raamwerk zoals React of Bootstrap gebruikt dat u eerder vanaf een externe server laadde, kunt u de verkleinde bestanden downloaden, aan uw project toevoegen en lokaal importeren. Bijvoorbeeld:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Als u een bibliotheek in een servicemedewerker wilt opnemen, stelt u de sleutel "background.type"
in op "module"
in het manifest en gebruikt u een import
.
Gebruik externe bibliotheken in scripts met tabbladen
U kunt tijdens runtime ook externe bibliotheken laden door ze toe te voegen aan de files
array wanneer u scripting.executeScript()
aanroept. U kunt tijdens runtime nog steeds gegevens op afstand laden.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Een functie injecteren
Als u meer dynamiek nodig heeft, kunt u met de nieuwe eigenschap func
in scripting.executeScript()
een functie als inhoudsscript injecteren en variabelen doorgeven met behulp van de eigenschap args
.
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], });
De Chrome Extension Samples-repository bevat een voorbeeld van een functie-injectie waar u doorheen kunt stappen. Een voorbeeld van getCurrentTab()
staat in de referentie voor die functie.
Zoek naar andere oplossingen
Als de voorgaande benaderingen niet helpen bij uw gebruiksscenario, moet u mogelijk een alternatieve oplossing vinden (dat wil zeggen migreren naar een andere bibliotheek) of andere manieren vinden om de functionaliteit van de bibliotheek te gebruiken. In het geval van Google Analytics kunt u bijvoorbeeld overstappen op het Google-meetprotocol in plaats van de officiële, op afstand gehoste JavaScript-versie te gebruiken, zoals beschreven in onze Google Analytics 4-handleiding .
Update het inhoudbeveiligingsbeleid
De "content_security_policy"
is niet verwijderd uit het manifest.json
-bestand, maar het is nu een woordenboek dat twee eigenschappen ondersteunt: "extension_pages"
en "sandbox"
.
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages
: Verwijst naar contexten in uw extensie, inclusief HTML-bestanden en servicemedewerkers.
sandbox
: Verwijst naar alle extensiepagina's in de sandbox die uw extensie gebruikt.
Verwijder niet-ondersteund inhoudsbeveiligingsbeleid
Manifest V3 staat bepaalde inhoudsbeveiligingsbeleidswaarden in het veld "extension_pages"
niet toe, die wel waren toegestaan in Manifest V2. Met name Manifest V3 verbiedt programma's die uitvoering van externe code toestaan. De script-src,
object-src
en worker-src
richtlijnen mogen alleen de volgende waarden hebben:
-
self
-
none
-
wasm-unsafe-eval
- Alleen uitgepakte extensies: elke localhost-bron (
http://localhost
,http://127.0.0.1
of elke poort op die domeinen)
Inhoudsbeveiligingsbeleidswaarden voor sandbox
kennen dergelijke nieuwe beperkingen niet.