Migliora la sicurezza delle estensioni

Miglioramento della sicurezza in Manifest V3

Questa è l'ultima delle tre sezioni che descrivono le modifiche necessarie per il codice che non fa parte del worker del servizio di estensione. Descrive le modifiche necessarie per migliorare la sicurezza delle estensioni. Le altre due sezioni trattano l'aggiornamento del codice necessario per l'upgrade a Manifest V3 e la sostituzione delle richieste web di blocco.

Rimuovere l'esecuzione di stringhe arbitrarie

Non puoi più eseguire la logica esterna utilizzando executeScript(), eval() e new Function().

  • Sposta tutto il codice esterno (JS, Wasm, CSS) nel bundle dell'estensione.
  • Aggiorna i riferimenti allo script e allo stile per caricare le risorse dal bundle di estensioni.
  • Utilizza chrome.runtime.getURL() per creare gli URL delle risorse in fase di runtime.
  • Utilizza un iframe con sandbox: eval e new Function(...) sono ancora supportati negli iframe con sandbox. Per maggiori dettagli, leggi la guida sugli iframe in sandbox.

Il metodo executeScript() ora si trova nello spazio dei nomi scripting anziché nello spazio dei nomi tabs. Per informazioni sull'aggiornamento delle chiamate, vedi Trasferimento executeScript().

Esistono alcuni casi speciali in cui è ancora possibile eseguire stringhe arbitrarie:

Rimuovere il codice ospitato da remoto

In Manifest V3, tutta la logica dell'estensione deve far parte del pacchetto dell'estensione. Non puoi più caricare ed eseguire file ospitati in remoto in base alle norme del Chrome Web Store. Ecco alcuni esempi:

  • File JavaScript estratti dal server dello sviluppatore.
  • Qualsiasi libreria ospitata su una CDN.
  • Librerie di terze parti in bundle che recuperano dinamicamente il codice ospitato in remoto.

Sono disponibili approcci alternativi, a seconda del caso d'uso e del motivo dell'hosting remoto. Questa sezione descrive gli approcci da prendere in considerazione. Se riscontri problemi con il codice ospitato in remoto, sono disponibili informazioni.

Funzionalità e logica basate sulla configurazione

L'estensione carica e memorizza nella cache una configurazione remota (ad esempio un file JSON) in fase di esecuzione. La configurazione memorizzata nella cache determina quali funzionalità sono attivate.

Logica esterna con un servizio remoto

L'estensione chiama un servizio web remoto. In questo modo puoi mantenere il codice privato e modificarlo in base alle esigenze, evitando al contempo il sovraccarico aggiuntivo di inviarlo di nuovo al Chrome Web Store.

Incorporare codice ospitato in remoto in un iframe con sandbox

Il codice ospitato in remoto è supportato negli iframe con sandbox. Tieni presente che questo approccio non funziona se il codice richiede l'accesso al DOM della pagina di incorporamento.

Raggruppare librerie di terze parti

Se utilizzi un framework popolare come React o Bootstrap che in precedenza caricavi da un server esterno, puoi scaricare i file minimizzati, aggiungerli al progetto e importarli localmente. Ad esempio:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

Per includere una libreria in un worker di servizio, imposta la chiave "background.type" su "module" nel manifest e utilizza un'istruzione import.

Utilizzare librerie esterne negli script iniettati nelle schede

Puoi anche caricare librerie esterne in fase di esecuzione aggiungendole all'array files quando chiami scripting.executeScript(). Puoi comunque caricare i dati da remoto in fase di esecuzione.

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

Eseguire l'iniezione di una funzione

Se hai bisogno di maggiore dinamismo, la nuova proprietà func in scripting.executeScript() ti consente di iniettare una funzione come script di contenuti e passare le variabili utilizzando la proprietà args.

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

In un file di script in background.

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

Nel worker di servizio in background.

Il repo Samples per le estensioni di Chrome contiene un esempio di inserimento di funzioni che puoi eseguire. Un esempio di getCurrentTab() è disponibile nella documentazione della funzione.

Cerca altre soluzioni alternative

Se gli approcci precedenti non sono utili per il tuo caso d'uso, potresti dover trovare una soluzione alternativa (ad es. eseguire la migrazione a una libreria diversa) o trovare altri modi per utilizzare la funzionalità della libreria. Ad esempio, nel caso di Google Analytics, puoi passare a Measurement Protocol di Google anziché utilizzare la versione JavaScript ufficiale ospitata in remoto, come descritto nella nostra guida a Google Analytics 4.

Aggiornare le norme di sicurezza dei contenuti

"content_security_policy" non è stato rimosso dal file manifest.json, ma ora è un dizionario che supporta due proprietà: "extension_pages" e "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: si riferisce ai contesti nell'estensione, inclusi i file HTML e i service worker.

sandbox: si riferisce a eventuali pagine di estensioni con sandbox utilizzate dall'estensione.

Rimuovere i criteri di sicurezza dei contenuti non supportati

Manifest V3 non consente determinati valori dei criteri di sicurezza dei contenuti nel campo "extension_pages" che erano consentiti in Manifest V2. Nello specifico, Manifest V3 non consente quelli che consentono l'esecuzione di codice da remoto. Le istruzioni script-src,, object-src e worker-src possono avere solo i seguenti valori:

  • self
  • none
  • wasm-unsafe-eval
  • Solo estensioni scompattate: qualsiasi origine localhost (http://localhost, http://127.0.0.1 o qualsiasi porta su questi domini)

I valori dei criteri di sicurezza dei contenuti per sandbox non sono soggetti a queste nuove limitazioni.