Verbeter de beveiliging van extensies

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 en new 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:

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 .

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

In een achtergrondscriptbestand.

Manifest V3
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],
});

Op de achtergrond servicemedewerker.

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 overschakelen naar 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" .

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "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.