Ogni estensione Chrome include un file manifest.json, che definisce gran parte del suo perimetro di capacità a livello browser: API richieste, pattern host, content script statici, permessi opzionali e connessioni esterne consentite. È un file pubblico incluso nel pacchetto che installi. Non dimostra quali capacità dichiarate il codice a runtime utilizzi davvero, quali dati escano dal dispositivo o quale accesso all’account avvenga tramite un login web separato.
Ho analizzato le dieci estensioni per scraping e automazione browser selezionate per questo audit, inclusa quella di Thunderbit, che è la nostra. Le differenze sono notevoli. Una non dichiara alcun accesso permanente ai siti. Un’altra dichiara tredici permessi, incluso clipboardRead. Thunderbit è l’unica estensione di questo gruppo a dichiarare debugger, una capacità ampia di aggancio al CDP con un profilo di rischio diverso dall’accesso alle pagine, da OAuth o dagli script forniti dall’utente.
Non si tratta di un’accusa. Un permesso esteso è spesso l’unico modo corretto per realizzare una certa funzione, e un set ristretto può semplicemente indicare che il prodotto fa meno cose. Il punto è che la differenza è enorme, è pubblica e non compare mai in una tabella comparativa.
Come è stato fatto
Ogni estensione è stata scaricata come .crx dall’endpoint di aggiornamento di Google — lo stesso URL usato da Chrome — poi è stata estratta e analizzata. Nessuna estensione è stata installata e nessun codice di estensione è stato eseguito. Si tratta della lettura di un file JSON.
I download sono stati eseguiti con un ritmo di circa una richiesta ogni due secondi. Ogni .crx, il relativo SHA-256 e il manifest.json estratto sono conservati come evidenze. Thunderbit è passato attraverso lo stesso script delle altre nove, senza canali separati, quindi la sua riga è derivata esattamente come le altre.
L’analisi usa due classi di evidenza, mantenute separate:
- Comportamento statico dichiarato: pattern host e voci
content_scripts, inclusimatches,run_ateall_frames. - Capacità disponibili al codice runtime: API nominate in
permissionsooptional_permissions. Queste dichiarazioni mostrano ciò che il codice potrebbe richiedere o invocare, non ciò che effettivamente fa.
Non viene assegnato alcun punteggio ordinale di tipo “più potente”. debugger, userScripts, accesso ampio agli host, scope OAuth, accesso agli appunti e messaggistica esterna espongono dati diversi e richiedono condizioni iniziali diverse. Confrontarli richiederebbe un modello di minaccia che questo audit basato solo sul manifesto non fornisce.
Le dimensioni riportate sotto sono i totali estratti in MiB (2²⁰ byte), sommati dagli elementi ZIP.
Aggiornato al 2026-07-29. Le estensioni si aggiornano; verifica di nuovo prima di citare.
Cosa dichiarano dieci manifest

Riferimento ufficiale: guida di Chrome alla dichiarazione dei permessi.
| Estensione | Versione | Estratto | File | Permessi | Accesso ai siti | Raggiunge file:// |
|---|---|---|---|---|---|---|
| Axiom.ai | 5.1.0 | 37.1 MiB | 232 | 8 | http://*/* + https://*/* | ✅ |
| Table Capture | 11.0.41 | 21.1 MiB | 115 | 4 (+3 opzionali) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16.8 MiB | 395 | 13 (+2 opzionali) | <all_urls> | ✅ |
| Thunderbit (nostra) | 4.6.4 | 15.9 MiB | 78 | 8 riconosciuti (+1 stringa array non riconosciuta: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6.3 MiB | 51 | 6 | *://*/* (inietta solo sul proprio dominio) | — |
| Listly | 0.9.6 | 3.5 MiB | 84 | 7 | http://*/*, https://*/*, file:///*.html | ✅ |
| Hexomatic | 1.8.4 | 2.7 MiB | 37 | 2 | solo domini propri | — |
| Agenty | 2.9.7 | 2.2 MiB | 49 | 4 | nessuno dichiarato | — |
| Clip to Clay | 1.8.0 | 0.7 MiB | 16 | 4 | 2 domini nominati | — |
| TexAu v2 | 1.6.6 | 0.3 MiB | 12 | 6 | 14 domini nominati | — |
Altri due erano nella lista dei candidati ma non sono in tabella, per motivi che meritano un approfondimento a parte.
Le differenze sono una scelta di progettazione, non un effetto della dimensione
Agenty non dichiara permessi host e non include alcun content script. I suoi quattro permessi sono activeTab, scripting, identity e identity.email. activeTab è il permesso più ristretto: concede accesso alla scheda corrente solo dopo che fai clic sull’estensione, e solo fino a quando non cambi pagina. Nulla viene eseguito sulle tue pagine a meno che tu non lo attivi. Il tutto in 2.2 MiB.
Axiom.ai dichiara http://*/* e https://*/*, inietta content script che corrispondono a <all_urls> e si scompatta in 37.1 MiB distribuiti su 232 file — diciassette volte la dimensione di Agenty, con accesso permanente a ogni pagina visitata.
Hexomatic è più vicino ad Agenty: due permessi (storage, tabs), nessun permesso host, content script limitati ai suoi due domini.
Clay for Chrome presenta un terzo profilo che vale la pena distinguere: dichiara *://*/* come permesso host, ma inietta content script solo sul proprio dominio. La capacità permanente è ampia; il comportamento automatico è ristretto. Una tabella dei permessi da sola tende a confondere questi due aspetti.
Cinque delle dieci possono raggiungere i file sul tuo disco
file:/// non è un sito web. È il tuo file system locale visualizzato in una scheda del browser — un PDF aperto, un export HTML, una fattura scaricata.
Riferimento ufficiale: documentazione Chrome sui match pattern.
Tre estensioni lo dichiarano esplicitamente. Due lo raggiungono senza nominarlo: <all_urls> include lo schema file:.
| Estensione | Come raggiunge file:// | Nomina file:// nel manifest? | Dove |
|---|---|---|---|
| Magical | corrisponde a file:///* — ogni file locale che Chrome può renderizzare, non solo HTML — in quattro delle sue sei voci di content script | ✅ | content script e web_accessible_resources |
| Listly | corrisponde a file:///*.html | ✅ | content script |
| Table Capture | content script su <all_urls>, e nomina anche lo schema | ✅ | web_accessible_resources |
| Axiom.ai | semplicemente in virtù del wildcard <all_urls> | — | da nessuna parte |
| Thunderbit (nostra) | semplicemente in virtù del wildcard <all_urls> | — | da nessuna parte |
http://*/* e https://*/* non coprono file://; anche <all_urls> e *://*/* differiscono su questo punto. Le cinque qui sono quelle le cui dichiarazioni raggiungono lo schema in un modo o nell’altro — non per il tipo di wildcard scelto, ma per come è definito il permesso.
Chrome blocca tutto questo dietro un interruttore per-estensione “Consenti accesso agli URL dei file”, che è disattivato di default, quindi la dichiarazione è una richiesta e non una concessione. Cinque su dieci è il conteggio corretto, e due di queste cinque non scrivono mai file:// in alcun punto del manifest: Axiom.ai e la nostra estensione.
Questo conteggio include anche web_accessible_resources, non solo content script e permessi host. Table Capture nomina file://*/* in quella sezione; ometterla lo collocherebbe erroneamente tra le estensioni i cui manifest raggiungono i file senza nominare lo schema.
Permessi invisibili finché non vengono richiesti

Gli optional_permissions sono dichiarati in anticipo ma richiesti a runtime, quindi non compaiono nel prompt di installazione. Due estensioni li usano, e una è particolarmente importante.
| Estensione | optional_permissions | Quello che conta davvero |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts può eseguire script forniti dall’utente nel contesto della pagina dopo che il gate utente di Chrome è stato abilitato |
| Magical | downloads, webRequest | webRequest osserva il traffico di rete |
userScripts non è disponibile finché non viene richiesto, e non è visibile a chiunque legga solo il numero dei permessi.
Ha anche un gate che gli altri permessi di questo audit non hanno, e ometterlo lo sopravvaluterebbe. Dichiarare userScripts non basta per usarlo: Chrome richiede prima un’azione esplicita dell’utente. Prima di Chrome 138 era la modalità Sviluppatore, attivata globalmente in chrome://extensions. Da Chrome 138 in poi è un interruttore per-estensione Consenti User Scripts nella pagina dettagli di quell’estensione, disattivato di default. Quindi, per un’installazione normale, la capacità è dichiarata ma inattiva. La formulazione corretta è condizionale: Table Capture può rendere disponibile l’API userScripts dopo che l’utente abilita il gate di Chrome. Questo audit non ha misurato quante persone aprano quella pagina o attivino l’opzione.
Nessuno dei due è nascosto; entrambi sono nel manifest. Una tabella che ignora il blocco opzionale sottostima due prodotti.
Tempistica dell’iniezione, non solo ampiezza
Non conta solo dove viene iniettato un content script, ma anche quando. document_start è il punto più precoce offerto da Chrome; all_frames raggiunge gli embed di terze parti.
Tutto ciò che nel gruppo inietta staticamente in tutti i frame, in ordine di timing dichiarato:
| Estensione | run_at | all_frames | Pattern di content script |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html più tutto http e https |
| Axiom.ai | document_start | ✅ | solo domini propri |
| Clay for Chrome | document_start | ✅ | solo domini propri |
| Thunderbit (nostra) | document_end | ✅ | <all_urls> |
| Magical | document_idle | ✅ | file:///* più http e https ampi |
| TexAu | document_idle (non impostato) | ✅ | quattordici pattern nominati |
Table Capture e Listly eseguono il punto di aggancio più precoce su pattern molto ampi. Axiom.ai e Clay for Chrome usano lo stesso timing, ma solo sui propri domini: stessa aggressività, bersaglio ristretto.
Per le dichiarazioni statiche, <all_urls> più all_frames è il limite massimo di ampiezza del matching, e sia Table Capture sia Thunderbit si collocano lì. Il timing dichiarato però è diverso: Table Capture usa document_start; il content script statico di Thunderbit usa document_end. Le API runtime sono una classe di capacità separata e non possono essere inferite da questa tabella.
Il conteggio dei permessi è una pessima statistica riassuntiva. Table Capture dichiara quattro permessi — meno della maggior parte qui — ma inietta a document_start in tutti i frame su <all_urls>, oltre a userScripts su richiesta.
Chi può inviare messaggi all’estensione
externally_connectable controlla quali pagine web o altre estensioni possono inviare messaggi direttamente allo script di background di un’estensione. Il comportamento predefinito è controintuitivo.
Omettere la chiave è l’impostazione permissiva. Il default di Chrome quando externally_connectable è assente è che qualsiasi estensione può connettersi, mentre nessuna pagina web può farlo. Dichiararla serve a limitare.
Letto così, il quadro si capovolge:
| Estensione | Dichiarazione externally_connectable | Chi può inviarle messaggi |
|---|---|---|
| Agenty | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Clay for Chrome | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Clip to Clay | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Listly | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Table Capture | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| TexAu | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Thunderbit (nostra) | omessa | Default permissivo — qualsiasi estensione può connettersi, nessuna pagina web può |
| Hexomatic | otto ID di estensione e sei origini web | Apre entrambi i canali partendo da una base chiusa |
| Axiom.ai | sette origini web, senza ids | Canale estensione chiuso, sette pagine web aperte |
| Magical | {"ids": [], "matches": []} | L’unica estensione qui che chiude esplicitamente entrambi i canali |
La regola di Chrome ha due livelli. Dalla documentazione del manifest:
| Situazione | Chi può connettersi |
|---|---|
| l’intera chiave è assente | "all extensions can connect, but no web pages can connect" |
chiave presente, ids non impostato o [] | "no extensions or apps can connect" |
chiave presente, matches non impostato o [] | "no web pages can connect" |
L’impostazione permissiva dipende dall’assenza dell’intera chiave. Una volta che la chiave è presente, entrambi i sotto-campi partono chiusi e i valori nominati ampliano ciascun canale.
Axiom.ai dichiara la chiave con il solo matches. Il suo ids è quindi non impostato, il che significa che nessuna estensione può inviargli messaggi — il canale estensione è chiuso, non lasciato aperto. Ciò che apre sono sette origini web, solo una delle quali è un dominio Axiom: due sono terze parti non attribuibili (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) e le restanti sono localhost, 0.0.0.0, un host Google APIs e una grande piattaforma social che non gestisce.
Hexomatic apre il canale estensione verso otto ID nominati. Con la chiave presente, la base è zero estensioni; nominarne otto la porta a otto. I suoi sei matches ampliano l’altro canale da nessuno, e due di questi sono http://localhost:8000/* e http://localhost:3000/* su HTTP puro — qualsiasi servizio in ascolto su quelle porte sulla macchina dell’utente rientra nella allowlist.
Sette delle dieci omettono la chiave del tutto, inclusa la nostra, e queste sette sono quelle che restano sul default permissivo per la messaggistica estensione-verso-estensione. Due estensioni chiudono quel canale: Magical in modo esplicito con ids: [], e Axiom.ai dichiarando la chiave e non menzionando mai ids. Magical è l’unica che chiude entrambi.
Questa ultima frase è il motivo per leggere i manifest invece di contare i permessi. La stessa estensione può essere ampia su un asse e la più restrittiva del gruppo su un altro.
L’asse che nessuno conta: gli scope OAuth
Un manifest può includere un blocco oauth2, e gli scope al suo interno danno accesso agli account presso altre aziende — un tipo di portata diverso da tutto quanto visto sopra, e che nessun conteggio dei permessi riflette.
Riferimento ufficiale: lista degli scope OAuth 2.0 di Google.
| Estensione | Scope oauth2 richiesti |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| Le altre sette, inclusa la nostra | nessuno dichiarato |
https://www.googleapis.com/auth/drive è quello più ampio. Google offre uno scope più ristretto, drive.file, che concede accesso solo ai file creati dall’app o scelti esplicitamente dall’utente; auth/drive consente di vedere, modificare, creare ed eliminare contenuti in tutto Drive dell’utente. auth/spreadsheets ha la stessa forma per ogni foglio di calcolo raggiungibile dall’account. Sia Axiom.ai sia Table Capture associano uno scope di account Google all’accesso alle pagine <all_urls>.
Due limiti a ciò che questa tabella prova. Uno scope è richiesto, non concesso — Google mostra una schermata di consenso e l’utente può rifiutare, e l’estensione potrebbe non chiamare mai l’API. Inoltre il manifest vede solo OAuth gestito tramite il flusso identity di Chrome; un’estensione che ti rimanda invece a una pagina web di accesso non dichiarerebbe nulla qui. Gli zeri delle sette voci significano “non richiesto in questo file”, non “nessun accesso al tuo account Google” — inclusa la nostra estensione, ed è per questo che questo asse viene riportato invece di essere presentato come prova di ristrettezza.
La nostra estensione, sulla stessa scala
Thunderbit 4.6.4 è passato attraverso lo stesso parser di manifest delle altre nove. Il pacchetto è di 15.9 MiB estratti su 78 file.
Comportamento statico dichiarato: <all_urls> compare sia nei permessi host sia nei match dei content script. Lo script statico gira in all_frames a document_end. Poiché <all_urls> include file:, il manifest può raggiungere file locali dopo che l’utente abilita l’interruttore di Chrome per l’accesso ai file. Thunderbit omette anche externally_connectable, quindi il default di Chrome consente messaggi da qualsiasi estensione ma da nessuna pagina web.
Tetto di capacità runtime: l’array permissions contiene nove stringhe: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups e tabs. Chrome riconosce otto di queste come permessi; commands è una chiave del manifest di primo livello e non ha effetto come voce di questo array. Thunderbit è l’unica estensione nel gruppo a dichiarare debugger, che può agganciare il CDP a una scheda. Il manifest rende inoltre disponibile scripting per la registrazione a runtime. Queste API creano capacità oltre la riga statica document_end, ma una lettura del manifest non può stabilire se Thunderbit invochi un particolare metodo CDP o registri uno script in un momento precedente specifico.
Questa distinzione blocca diversi confronti allettanti ma non validi. L’assenza di un permesso più ristretto come cookies non limita ciò a cui potrebbe accedere il codice con debugger. L’assenza di clipboardRead non prova che l’accesso agli appunti sia impossibile. Al contrario, la presenza di debugger non è prova che quei percorsi vengano effettivamente usati. Per rispondere a una qualsiasi di queste domande servono ispezione del sorgente o tracing runtime, nessuno dei quali è stato eseguito.
Su questo strumento, Thunderbit è ampio nell’accesso statico ai siti, unico nel gruppo per aver dichiarato debugger, e resta al default di Chrome per la messaggistica estensione-verso-estensione. Non esiste un singolo ranking di “più forte” perché l’audit non fornisce un modello di minaccia comune tra CDP, OAuth, userScripts, appunti e accesso agli host.
Il design misurato che nessuno pubblicizza
TexAu pesa 0.3 MiB — il più piccolo qui per un fattore di due — e nomina quattordici siti specifici invece di usare un wildcard: social network, una piattaforma per sviluppatori, piattaforme editoriali, un prodotto di chat, un fornitore di dati aziendali e il proprio dominio. I suoi content script corrispondono esattamente agli stessi quattordici.
Puoi leggere questo manifest e sapere con precisione dove l’estensione è attiva. È anche una forma di dichiarazione del prodotto: l’elenco dei target dice in modo più chiaro a cosa serve lo strumento rispetto al marketing.
Il compromesso è reale: una lista nominata non può fare scraping su un sito che non è incluso, e ogni nuovo target richiede una release. Ma “quattordici domini nominati” ed “ogni URL esistente” sono due proposte molto diverse, e solo una delle due è leggibile.
Due prodotti che non erano ciò che la lista diceva
L’estensione di Captain Data non è distribuita pubblicamente. L’endpoint di aggiornamento di Google restituisce HTTP 204 con body vuoto per il suo ID estensione — la risposta tipica di qualcosa che lo store non serve in forma anonima. La pagina del listing invece era servita in modo anonimo — HTTP 200, 509.829 byte. Ciò che la cattura non è riuscita a trovare lì dentro è un numero di versione, una data di ultimo aggiornamento o un conteggio installazioni; le note dello script indicano che un valore nullo in quel punto è una prova debole, e non è stata osservata alcuna schermata di login. L’ID è reale e first-party, quindi la lettura più probabile è una distribuzione via link o non elencata, ma non ho potuto distinguerla da una rimozione dal catalogo e non farò ipotesi.
Dataflow Kit non ha alcuna estensione Chrome. Il suo sito descrive una web app ospitata con selezione point-and-click e una REST API. Era comunque finita in una shortlist di estensioni Chrome — che è in genere così che queste liste vengono costruite.
Obsolescenza e diffusione, visto che entrambe sono facili da verificare
I metadati dello store aggiungono contesto alla selezione dei prodotti oltre ai permessi. Gli stessi campi sono stati rilevati per ogni estensione il 2026-07-30.
| Estensione | Versione nello store | Ultimo aggiornamento | Fascia installazioni |
|---|---|---|---|
| Thunderbit (nostra) | 4.6.4 | 28 luglio 2026 | 200.000 |
| Listly | 0.9.6 | 25 luglio 2026 | 100.000 |
| Axiom.ai | 5.1.0 | 20 luglio 2026 | 100.000 |
| Table Capture | 11.0.41 | 26 giugno 2026 | 200.000 |
| Magical | 3.119.1 | 4 aprile 2026 | 200.000 |
| Agenty | 2.9.7 | 8 febbraio 2026 | 10.000 |
| TexAu | 1.6.6 | 20 agosto 2025 | 7.000 |
| Clay for Chrome | 1.0.0 | 9 aprile 2025 | 10.000 |
| Clip to Clay | 1.8.0 | 8 aprile 2025 | 1.000 |
| Hexomatic | 1.8.4 | 6 settembre 2024 | 3.000 |
| Captain Data | — | — | non servita pubblicamente |
Tre prodotti non rilasciano una nuova versione da oltre un anno, e Hexomatic da quasi due. Per le estensioni questo conta più che per le librerie: Chrome rilascia una versione stabile circa ogni quattro settimane e la piattaforma delle estensioni cambia continuamente sotto i nostri piedi. userScripts ha spostato il suo gate utente in Chrome 138; un’estensione pubblicata l’ultima volta nel 2024 è stata costruita su un insieme di regole diverso da quello che il browser applica oggi.
Due cose che questa tabella non è. I conteggi di installazione sono raggruppati da Google — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — quindi servono solo a confrontare ordini di grandezza, e nulla di più fine; inoltre alcuni prodotti pubblicizzano numeri più alti nei propri materiali. Una data recente è un fatto sulla pubblicazione, non un giudizio sulla qualità della manutenzione o sul rischio dei permessi.
Un effetto collaterale utile: la versione nello store corrisponde alla versione del manifest in tutti e dieci i pacchetti analizzati. I file CRX letti da questo audit sono quelli che lo store sta servendo oggi, non copie vecchie.
L’attualità modifica quanto follow-up meriti una selezione; non cambia la semantica del manifest. Un’estensione con domini nominati e aggiornata un anno fa può comunque esporre meno superficie di pagina di una con wildcard pubblicata ieri. Il pacchetto più recente può ancora essere la scelta operativa migliore se segue rapidamente i cambiamenti di Chrome. Per una shortlist, usa la data dello store per decidere cosa ritestare, poi usa il manifest per capire cosa richiede una revisione di capacità più approfondita. Non trasformare le due colonne in un solo punteggio.
Cosa non ti dice un manifest
Un permesso dichiarato è un tetto, non un comportamento. <all_urls> significa che un’estensione può leggere ogni pagina. Non significa che lo faccia, né che qualcosa lasci il tuo dispositivo. Stabilire cosa accade davvero richiede il monitoraggio del traffico di rete a runtime — un lavoro diverso, non svolto qui — e nulla di quanto scritto sopra deve essere letto come prova di uso scorretto.
Approfondimento correlato: esperimento sulla testabilità delle estensioni Chrome.
Tre ulteriori limiti:
- Chrome mette molti di questi aspetti dietro un gate. L’accesso ai file è disattivato di default;
activeTabè volutamente ristretto; i permessi opzionali richiedono un prompt runtime; l’utente vede un elenco dei permessi durante l’installazione. - I permessi ampi sono spesso necessari. Uno strumento il cui compito è “estrarre una tabella da qualsiasi pagina tu stia visitando” non può funzionare con una allowlist di domini nominati. Un ambito ristretto a volte è disciplina, altre volte è semplicemente un prodotto più limitato.
- Una versione, un giorno. Ogni dato proviene dal pacchetto servito il 2026-07-29.
Correzioni materiali nell’analisi
I conteggi pubblicati usano tre regole facili da sbagliare quando si scrive in fretta un parser di manifest. Primo, <all_urls> include lo schema file:, ma Chrome mantiene l’accesso reale ai file dietro un toggle controllato dall’utente. Secondo, web_accessible_resources.matches va esaminato insieme ai content script e ai permessi host; è lì che Table Capture nomina esplicitamente file://*/*. Terzo, externally_connectable ha default diversi a seconda che l’intera chiave sia assente oppure presente con un sotto-campo vuoto. Le tabelle qui sopra applicano queste regole in modo coerente.
Il totale dei permessi di Thunderbit distingue anche tra stringhe grezze e permessi Chrome riconosciuti. Il suo array contiene nove voci, ma commands appartiene al livello superiore, quindi il conteggio effettivo usato qui è di otto permessi riconosciuti più una stringa non riconosciuta. Infine, le dichiarazioni statiche content_scripts non sono una prova che il codice invochi scripting.registerContentScripts o un metodo CDP. Quelle possibilità compaiono solo come capacità runtime, mai come comportamento osservato. I manifest grezzi, gli hash CRX e l’output del parser sono la traccia di audit per queste normalizzazioni, così i lettori non devono prendere il testo alla cieca.
Per una vera decisione di installazione, confronta almeno quattro dimensioni separatamente: quali pagine sono incluse di default, quale azione esplicita dell’utente sblocca maggiore portata, quali API browser o account diventano disponibili e quali soggetti esterni possono messaggiare l’estensione. Il modello activeTab di Agenty, userScripts protetto di Table Capture, lo scope Drive di Axiom.ai e la dichiarazione debugger di Thunderbit non sono punti su una stessa scala lineare. Sono risposte diverse a domande di minaccia diverse.
Ecco quel confronto applicato a quattro design volutamente differenti:
| Estensione | Ambito pagina visibile nel manifest | Gate aggiuntivo | Capacità non legata alle pagine in questo audit | Postura dei chiamanti esterni |
|---|---|---|---|---|
| Agenty | nessun permesso host o content script statico | l’utente attiva activeTab sulla scheda corrente | permessi Chrome identity | chiave omessa: qualsiasi estensione può connettersi, nessuna pagina web può |
| Table Capture | script statici su <all_urls> in tutti i frame a document_start | l’accesso ai file è disattivato di default; userScripts richiede il gate utente separato di Chrome | userScripts, downloads e identity opzionali | chiave omessa: qualsiasi estensione può connettersi, nessuna pagina web può |
| Axiom.ai | accesso wildcard HTTP e HTTPS; script statici a document_start sui propri domini | consenso OAuth per gli scope Google richiesti | scope OAuth Drive e Sheets dichiarati | chiamanti estensione chiusi; aperte sette origini web |
| Thunderbit | accesso host <all_urls> e script statici in tutti i frame a document_end | l’accesso ai file è disattivato di default; l’aggancio di debugger ha un comportamento visibile all’utente controllato da Chrome | debugger, scripting, tabs e altre API browser dichiarate | chiave omessa: qualsiasi estensione può connettersi, nessuna pagina web può |
Anche questa tabella non produce un vincitore. L’accesso pagina permanente ristretto di Agenty non dice nulla su come il suo backend tratti i dati inviati. Gli scope account di Axiom.ai non sono paragonabili a un’estensione che legge la pagina corrente. La dichiarazione userScripts di Table Capture resta inattiva finché l’utente non abilita il suo gate separato. Il permesso debugger di Thunderbit espone una vasta superficie di controllo del browser, ma il manifest non rivela quali domini o metodi CDP usi il codice. Ogni riga ti dice cosa ispezionare dopo: traffico di rete runtime, codice sorgente, flusso di consenso o trace delle API browser.

La stessa distinzione conta quando si legge il prompt di installazione di Chrome. Un semplice conteggio dei permessi non può mostrare tempistica, ampiezza sui frame, scope OAuth, web_accessible_resources o una chiave externally_connectable omessa. Al contrario, una dichiarazione ampia non è prova di raccolta o esfiltrazione. Il risultato utile di un audit del manifest è un piano di test runtime prioritizzato: identificare la superficie dati, annotare il gate utente e poi osservare se il percorso dichiarato viene effettivamente esercitato.
Come leggere il proprio
Approfondimento correlato: guida all’automazione browser.
chrome://extensions→ Dettagli mostra l’accesso ai siti concesso e consente di impostarlo su al clic per tutto ciò che non richiede accesso permanente. Questo restringe la metà dell’accesso ai siti di quanto riportato sopra. Non modifica la messaggistica in ingresso (externally_connectableraggiunge comunque il service worker), né i permessi a livello browser. La dichiarazionedebuggerdi Thunderbit è rilevante qui. La documentazione di sicurezza delle estensioni di Chromium afferma che l’API debugger “in some cases also sidestep other typical restrictions, such as host permissions or file access”, quindi impostare l’accesso ai siti su “al clic” non limita ciò a cui può arrivare. Inoltre il controllo non toccatabs,webNavigation,clipboardRead,downloadso qualunque cosa inoptional_permissions.- Per il file grezzo, il pacchetto si trova nella directory di Chrome
Extensions/<id>/<version>/. Leggi sei campi:permissions,optional_permissions,host_permissions,content_scripts(inclusimatches,run_ateall_frames),externally_connectable— ricordando che una chiave assente è permissiva per i chiamanti delle estensioni — eweb_accessible_resources, i cuimatchespossono nominare schemi che i content script non nominano mai. L’ultimo campo di Thunderbit ha due voci<all_urls>che espongonoindex.htmle due script bundlizzati a ogni origine, conuse_dynamic_url: false, il che consente a una pagina di verificare se quegli URL stabili dell’estensione si risolvono. - Controlla la data dell’ultimo aggiornamento del listing rispetto alla versione corrente di Chrome.
Disclosure e risorse: questo articolo è pubblicato da Thunderbit, la cui estensione è inclusa nella stessa tabella e nello stesso parser. Il nostro pilastro open source per gli scraper copre gli strumenti non basati su estensione.
Prova Thunderbit per l’estrazione di dati web
La versione breve
Dieci estensioni per scraping e automazione, compresa la nostra, sono state lette partendo dai loro manifest.
Agenty dichiara nessun accesso ai siti e nessun content script, lavorando solo sulla scheda che stai guardando quando fai clic, in 2.2 MiB. Axiom.ai dichiara ogni URL HTTP e HTTPS su 37.1 MiB. Magical dichiara tredici permessi inclusi clipboardRead — ed è anche l’unica estensione qui che chiude completamente la messaggistica in ingresso. Table Capture dichiara appena quattro permessi, e inietta a document_start in tutti i frame su <all_urls> — lo stesso tetto di corrispondenza che raggiunge anche la nostra estensione, ma prima — più userScripts su richiesta. TexAu è la più piccola, e nomina il maggior numero di target — quattordici pattern distribuiti su tredici proprietà distinte. Non è l’unica a nominarli: Clip to Clay ne dichiara due (clay.com e un sito di terze parti), e Hexomatic e Clay for Chrome nominano i propri domini. TexAu è l’unica la cui lista nominata è in gran parte composta da siti altrui. Cinque delle dieci possono raggiungere i file sul tuo disco, e due di queste — Axiom.ai e la nostra — senza scrivere mai file://.
Thunderbit, la nostra, si colloca nel gruppo più ampio: <all_urls> sia per l’accesso host sia per l’iniezione statica, più debugger, che nessun’altra estensione di questo set dichiara. Resta al default di Chrome che consente messaggi da qualsiasi estensione, e raggiunge file:// dopo che è stato abilitato il gate utente di Chrome.
Una dichiarazione è un tetto, non un comportamento, e nulla di tutto questo dimostra un uso scorretto. Ma è pubblica, è gratuita da verificare, e la distanza tra i due estremi è più grande di qualsiasi cosa riportata nelle pagine prodotto.
Prova Thunderbit per l’estrazione di dati web Get Started Free
FAQ
Un permesso ampio significa che l’estensione stia facendo qualcosa di sbagliato — e perché contare i permessi non basta?
No, e perché il conteggio perde due aspetti. <all_urls> significa che un’estensione può leggere ogni pagina che visiti; non dice nulla su ciò che fa davvero o su cosa esca dal tuo dispositivo, e uno strumento costruito per estrarre dati da qualsiasi pagina non può realisticamente funzionare con una lista di domini nominati. Il risultato che conta è la differenza tra i prodotti, non un illecito — per verificare il comportamento reale serve l’analisi del traffico runtime, che questo audit non ha eseguito. Quanto al conteggio: le impostazioni di iniezione non sono permessi, quindi Table Capture dichiara quattro permessi ma inietta a document_start, in all_frames, su <all_urls>. E gli optional_permissions non compaiono affatto nel prompt di installazione — Table Capture può richiedere userScripts a runtime, consentendo l’esecuzione di script arbitrari forniti dall’utente nei contesti di pagina, e Magical può richiedere webRequest.
Quale di queste chiede meno di tutte?
Agenty: quattro permessi, nessun permesso host, nessun content script. Si basa su activeTab, che concede accesso alla scheda corrente solo dopo il clic sull’estensione e solo finché non cambi pagina. Hexomatic viene dopo, con due permessi e content script limitati ai propri domini.
Come può un’estensione raggiungere i miei file locali senza dichiarare file://?
Perché <all_urls> include lo schema file:. Listly, Magical e Table Capture nominano esplicitamente pattern file:// — Magical nei content script e Table Capture in web_accessible_resources. Axiom.ai e Thunderbit lo raggiungono tramite il wildcard senza nominarlo in alcun punto. http://*/* e https://*/* non coprono file://. Chrome mantiene l’accesso ai file disattivato di default dietro un toggle per-estensione, quindi la dichiarazione è una richiesta e non una concessione.
Che cos’è externally_connectable e perché ometterlo è l’opzione permissiva?
Indica quali origini web o ID di estensioni possono inviare messaggi allo script di background di un’estensione. Il default di Chrome quando la chiave è assente è che qualsiasi estensione possa connettersi e nessuna pagina web possa farlo. Sette di queste dieci la omettono, inclusa Thunderbit. Con la chiave presente, Hexomatic apre il canale estensione verso otto ID nominati; Axiom.ai apre sette origini web lasciando chiuso il canale estensione; Magical dichiara liste vuote per entrambi, chiudendo entrambi i canali.
Cosa dichiara il manifest di Thunderbit?
<all_urls> per l’accesso host e per l’iniezione statica dei content script, in all_frames a document_end; 15.9 MiB distribuiti su 78 file; e nove stringhe nell’array dei permessi. Otto sono permessi riconosciuti: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups e tabs. commands è una chiave del manifest a livello superiore e non ha effetto in quell’array. Nessun’altra estensione di questo set dichiara debugger. Thunderbit raggiunge inoltre file:// tramite <all_urls> dopo che è stato abilitato il gate di accesso ai file di Chrome, e omette externally_connectable. Il comportamento runtime non è stato eseguito, quindi l’audit non afferma quali metodi CDP o di scripting l’estensione invochi davvero.


