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 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 l'upgrade a Manifest V3 e la sostituzione delle richieste web di blocco.
Rimuovere l'esecuzione di stringhe arbitrarie
Non puoi più eseguire logica esterna utilizzando executeScript(), eval() e new Function().
- Sposta tutto il codice esterno (JS, Wasm, CSS) nel bundle dell'estensione.
- Aggiorna i riferimenti a script e stili per caricare le risorse dal bundle dell'estensione.
- Utilizza
chrome.runtime.getURL()per creare URL delle risorse in fase di runtime. - Utilizza un iframe con sandbox:
evalenew Function(...)sono ancora supportati negli iframe con sandbox. Per maggiori dettagli, leggi la guida sugli iframe con 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 Spostare executeScript().
Esistono alcuni casi speciali in cui l'esecuzione di stringhe arbitrarie è ancora possibile:
- Inserire fogli di stile ospitati in remoto in una pagina web utilizzando insertCSS
- Per le estensioni che utilizzano
chrome.devtools: inspectWindow.eval consente di eseguire JavaScript nel contesto della pagina esaminata. - Le estensioni del debugger possono utilizzare chrome.debugger.sendCommand per eseguire JavaScript in una destinazione di debug.
Rimuovere il codice ospitato in 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 conformità alle norme del Chrome Web Store. Ecco alcuni esempi:
- File JavaScript recuperati 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 la gestione del codice ospitato da remoto, abbiamo a disposizione una guida.
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 quali funzionalità sono attive.
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 l'overhead aggiuntivo del reinvio 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 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 manifest e utilizza un'istruzione import.
Utilizzare librerie esterne negli script inseriti nelle schede
Puoi anche caricare librerie esterne in fase di runtime aggiungendole all'array files quando chiami 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']
});
Inserire una funzione
Se hai bisogno di maggiore dinamicità, la nuova proprietà func in scripting.executeScript() ti consente di inserire una funzione come script dei contenuti e passare variabili utilizzando la proprietà args.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
In un file di script in background.
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 di esempi di estensioni di Chrome contiene un esempio di iniezione di funzioni che puoi esaminare passo passo. Un esempio di getCurrentTab() è disponibile nel riferimento per quella funzione.
Cercare 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 altri modi per utilizzare la funzionalità della libreria. Ad esempio, nel caso di Google Analytics, puoi passare al Measurement Protocol di Google anziché utilizzare la versione JavaScript ospitata in remoto ufficiale, come descritto nella nostra guida a Google Analytics 4.
Aggiorna la policy 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".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: si riferisce ai contesti dell'estensione, inclusi i file HTML e i service worker.
sandbox: si riferisce a tutte le pagine di estensione con sandbox utilizzate dall'estensione.
Rimuovere le policy di sicurezza dei contenuti non supportate
Manifest V3 non consente determinati valori della policy di sicurezza dei contenuti nel campo "extension_pages" che erano consentiti in Manifest V2. In particolare, Manifest V3 non consente quelli che permettono l'esecuzione di codice da remoto. Le direttive script-src,, object-src e worker-src possono avere solo i seguenti valori:
selfnonewasm-unsafe-eval- Solo estensioni non compresse: qualsiasi origine localhost (
http://localhost,http://127.0.0.1o qualsiasi porta su questi domini)
I valori della policy di sicurezza dei contenuti per sandbox non presentano nuove limitazioni.