Beveiliging verbeteren in Manifest V3
Dit is het laatste van 3 gedeelten waarin wijzigingen worden beschreven die nodig zijn voor code die geen deel uitmaakt van de service worker van de extensie. Hierin worden de wijzigingen beschreven die nodig zijn om de beveiliging van extensies te verbeteren. De andere 2 gedeelten gaan over je code updaten die nodig is om te upgraden naar Manifest V3 en blokkerende webverzoeken vervangen.
Uitvoering van willekeurige tekenreeksen verwijderen
U kunt niet meer externe logica uitvoeren met executeScript(), eval() en new Function().
- Verplaats alle externe code (JS, Wasm, CSS) naar je extensiepakket.
- Update script- en stijlverwijzingen om bronnen uit de extensiebundel te laden.
- Gebruik
browser.runtime.getURL()om tijdens runtime resource-URL's te maken. - Gebruik een sandbox-iframe:
evalennew Function(...)worden nog steeds ondersteund in sandbox-iframes. Lees de gids over iframes in een sandbox voor meer informatie.
De methode executeScript() bevindt zich nu in de naamruimte scripting in plaats van in de naamruimte tabs. Ga naar executeScript() verplaatsen voor informatie over hoe je gesprekken updatet.
Er zijn een paar speciale gevallen waarin het nog steeds mogelijk is om willekeurige tekenreeksen uit te voeren:
- Externe stylesheets injecteren in een webpagina met insertCSS
- Voor extensies die
browser.devtoolsgebruiken: Met inspectWindow.eval kan JavaScript worden uitgevoerd in de context van de geïnspecteerde pagina. - Foutopsporingsextensies kunnen browser.debugger.sendCommand gebruiken om JavaScript uit te voeren in een foutopsporingsdoel.
Extern gehoste code verwijderen
In Manifest V3 moet alle logica van je extensie deel uitmaken van het extensiepakket. Je kunt geen bestanden meer laden en uitvoeren die op afstand worden gehost, volgens het Chrome Web Store-beleid. Voorbeelden hiervan zijn:
- JavaScript-bestanden die van de server van de ontwikkelaar worden opgehaald.
- Elke bibliotheek die wordt gehost op een CDN.
- Gebundelde bibliotheken van derden die dynamisch op afstand gehoste code ophalen.
Er zijn alternatieve benaderingen beschikbaar, afhankelijk van je use case en de reden voor hosting op afstand. In dit gedeelte worden mogelijke benaderingen beschreven. Als je problemen hebt met extern gehoste code, hebben we richtlijnen beschikbaar.
Functies en logica op basis van configuratie
Je extensie laadt en cached tijdens runtime een externe configuratie (bijvoorbeeld een json-bestand). De configuratie in het cachegeheugen bepaalt welke functies aanstaan.
Geëxternaliseerde logica met een externe service
Je extensie roept een externe webservice aan. Zo kun je code privé houden en deze zo nodig wijzigen zonder de extra overhead van opnieuw indienen bij de Chrome Web Store.
Extern gehoste code insluiten in een iframe in de sandbox
Extern gehoste code wordt ondersteund in iframes in sandboxes. Deze aanpak werkt niet als de code toegang tot het DOM van de inpaginering vereist.
Bibliotheken van derden bundelen
Als u een populair framework zoals React of Bootstrap gebruikt dat u eerder vanaf een externe server laadde, kunt u de verkleinde bestanden downloaden, ze aan uw project toevoegen en ze lokaal importeren. Voorbeeld:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Als je een bibliotheek wilt opnemen in een service worker, stel je de "background.type"-sleutel in het manifest in op "module" en gebruik je een import-statement.
Externe bibliotheken gebruiken in scripts die in tabbladen worden geïnjecteerd
Je kunt ook externe bibliotheken tijdens runtime laden door ze toe te voegen aan de array files als je scripting.executeScript() aanroept. Je kunt nog steeds gegevens op afstand laden tijdens de runtime.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Een functie injecteren
Als je meer dynamiek nodig hebt, kun je met de nieuwe property func in scripting.executeScript() een functie injecteren als content script en variabelen doorgeven met de property args.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
In een achtergrondscriptbestand.
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], });
Op de achtergrond: service worker.
De repo met voorbeelden van Chrome-extensies bevat een voorbeeld van functie-injectie dat je kunt doorlopen. Een voorbeeld van getCurrentTab() staat in de referentie voor die functie.
Zoek naar andere tijdelijke oplossingen
Als de vorige benaderingen niet helpen bij uw use case, moet u misschien een alternatieve oplossing vinden (bijvoorbeeld 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 overschakelen naar het Google Measurement Protocol in plaats van de officiële JavaScript-versie die op afstand wordt gehost, zoals beschreven in onze handleiding voor Google Analytics 4.
Het Content Security Policy updaten
De "content_security_policy" is niet verwijderd uit het bestand manifest.json, maar is nu een woordenlijst die 2 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 je extensie, waaronder HTML-bestanden en service workers.
sandbox: Verwijst naar gesandboxte extensiepagina's die je extensie gebruikt.
Niet-ondersteunde beveiligingsbeleidsregels voor content verwijderen
Manifest V3 staat bepaalde waarden voor het contentbeveiligingsbeleid niet toe in het veld "extension_pages" die wel waren toegestaan in Manifest V2. Manifest V3 staat specifiek geen extensies toe die code-uitvoering op afstand mogelijk maken. De richtlijnen script-src, object-src en worker-src kunnen alleen de volgende waarden hebben:
selfnonewasm-unsafe-eval- Alleen uitgepakte extensies: elke localhost-bron (
http://localhost,http://127.0.0.1of elke poort op die domeinen)
Waarden voor het contentbeveiligingsbeleid voor sandbox hebben geen dergelijke nieuwe beperkingen.