Migliora la sicurezza delle estensioni

Migliorare la sicurezza in Manifest V3

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

Rimuovi l'esecuzione di stringhe arbitrarie

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

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

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

Esistono alcuni casi particolari in cui l'esecuzione di stringhe arbitrarie è ancora possibile:

Rimuovi il codice ospitato in remoto

In Manifest V3, tutta la logica dell'estensione deve essere inclusa nel pacchetto dell'estensione. In base ai criteri del Chrome Web Store, non potrai più caricare ed eseguire file ospitati in remoto. Tra gli esempi possibili:

  • File JavaScript estratti dal server dello sviluppatore.
  • Qualsiasi libreria ospitata su una rete CDN.
  • Librerie di terze parti in bundle che recuperano in modo dinamico 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 considerare. Se hai problemi con la gestione del codice ospitato in remoto, abbiamo delle linee guida disponibili.

Funzionalità e logica basate sulla configurazione

L'estensione carica e memorizza nella cache una configurazione remota (ad esempio un file JSON) in fase di runtime. La configurazione memorizzata nella cache determina le funzionalità abilitate.

Logica esternalizzata con un servizio remoto

L'estensione chiama un servizio web remoto. In questo modo puoi mantenere privato il codice e modificarlo in base alle esigenze, evitando al tempo stesso l'overhead richiesto dal reinvio al Chrome Web Store.

Incorpora il 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 molto diffuso come React o Bootstrap che stavi caricando in precedenza da un server esterno, puoi scaricare i file minimizzati, aggiungerli al tuo 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 service worker, imposta la chiave "background.type" su "module" nel file manifest e utilizza un'istruzione import.

Usa librerie esterne in script con inserimento di tabulazioni

Puoi anche caricare librerie esterne in fase di runtime aggiungendole all'array files durante la chiamata a scripting.executeScript(). Puoi comunque caricare i dati da remoto in fase di runtime.

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

Inserisci una funzione

Se hai bisogno di maggiore dinamismo, la nuova proprietà func in scripting.executeScript() ti consente di inserire una funzione come script di contenuti e trasmettere 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 service worker in background.

Il repository Chrome Extension Samples contiene un esempio di iniezione di funzioni che puoi seguire. Un esempio di getCurrentTab() è nel riferimento per tale 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 esempio 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 Google Measurement Protocol anziché utilizzare la versione JavaScript ufficiale ospitata in remoto, come descritto nella guida di Google Analytics 4.

Aggiornare i criteri 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: fa riferimento ai contesti nell'estensione, inclusi i file HTML e i service worker.

sandbox: fa riferimento a eventuali pagine di estensioni con sandbox utilizzate dall'estensione.

Rimuovi i criteri di sicurezza dei contenuti non supportati

Nel campo "extension_pages", Manifest V3 non consente alcuni valori dei criteri di sicurezza dei contenuti consentiti in Manifest V2. Nello specifico, Manifest V3 non consente le applicazioni 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 non pacchettizzate: qualsiasi origine localhost, (http://localhost, http://127.0.0.1 o qualsiasi porta su quei domini)

I valori dei criteri di sicurezza del contenuto per sandbox non presentano nuove limitazioni di questo tipo.