Ogni estensione Chrome include un file manifest.json, che definisce una parte importante del suo potenziale a livello di browser: API richieste, pattern degli host, script statici iniettati nelle pagine, permessi facoltativi e connessioni esterne consentite. Si tratta di un file pubblico presente nel pacchetto che installi. Non dimostra però quali funzionalità dichiarate vengano davvero usate dal codice a runtime, quali dati lascino il dispositivo o quali accessi all’account avvengano tramite un login web separato.
Ho esaminato le dieci estensioni per scraping e automazione browser selezionate per questa analisi, inclusa Thunderbit, che è la nostra. Il quadro è molto vario. Una non dichiara alcun accesso stabile ai siti. Un’altra dichiara tredici permessi, incluso clipboardRead. Thunderbit è l’unica estensione di questo gruppo che dichiara debugger, una capacità ampia di aggancio al CDP con un profilo di rischio diverso rispetto all’accesso alle pagine, a OAuth o agli script forniti dall’utente.
Questo non è un’accusa. Un permesso ampio è spesso l’unico modo onesto per realizzare una certa funzione, mentre un perimetro ristretto può semplicemente significare che il prodotto fa meno cose. Il punto è che la differenza è enorme, è pubblica e non compare mai in una tabella comparativa.
Come è stata fatta l’analisi
Ogni estensione è stata scaricata come .crx dal punto di aggiornamento di Google — lo stesso URL usato da Chrome — quindi scompattata e analizzata. Nessuna estensione è stata installata e nessun codice è stato eseguito. Si tratta della lettura di un file JSON.
I download sono stati dilazionati a circa una richiesta ogni due secondi. Ogni .crx, il relativo SHA-256 e il manifest.json estratto sono conservati come artefatti. Thunderbit ha seguito lo stesso script delle altre nove, senza canali alternativi, quindi la sua riga è stata ricavata esattamente nello stesso modo.
L’analisi usa due classi di evidenza e le mantiene separate:
- Comportamento statico dichiarato: pattern degli host e voci
content_scripts, inclusimatches,run_ateall_frames. - Capacità disponibile al codice a runtime: API nominate in
permissionsooptional_permissions. Queste dichiarazioni mostrano cosa il codice potrebbe richiedere o invocare, non che lo faccia davvero.
Non viene assegnato alcun punteggio ordinal “più potente”. debugger, userScripts, accesso esteso agli host, scope OAuth, accesso agli appunti e messaggistica esterna espongono dati diversi e richiedono condizioni preliminari diverse. Per confrontarli servirebbe un modello di minaccia che questa analisi basata solo sul manifest non fornisce.
Le dimensioni riportate sotto sono i totali scompattati in MiB (2²⁰ byte), sommati dalle voci ZIP.
Aggiornato al 2026-07-29. Le estensioni si aggiornano; verifica prima di citare.
Cosa dichiarano dieci manifest

Riferimento ufficiale: Chrome's permission declaration guide.
| Estensione | Versione | Scompattata | 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 facoltativi) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16.8 MiB | 395 | 13 (+2 facoltativi) | <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 | — |
Altre due erano nella lista dei candidati e non compaiono in tabella, per motivi che vale la pena raccontare a parte.
La varietà è una scelta di design, non un effetto delle dimensioni
Agenty non dichiara alcun host permission e non include content script. I suoi quattro permessi sono activeTab, scripting, identity e identity.email. activeTab è il più ristretto: concede accesso alla scheda corrente solo dopo aver cliccato sull’estensione e solo finché non si cambia pagina. Nulla viene eseguito sulle tue pagine se non lo avvii tu. Il tutto in 2.2 MiB.
Axiom.ai dichiara http://*/* e https://*/*, inietta content script che corrispondono a <all_urls> e arriva a 37.1 MiB distribuiti in 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 host permission, content script limitati ai propri due domini.
Clay for Chrome rappresenta una terza forma che vale la pena distinguere: dichiara *://*/* come host permission, ma inietta content script solo sul proprio dominio. La capacità stabile è ampia; il comportamento automatico è stretto. Una tabella dei permessi, da sola, confonde queste due cose.
Cinque su dieci possono raggiungere i file locali
file:/// non è un sito web. È il tuo file system locale reso visibile in una scheda del browser — un PDF aperto, un export HTML, una fattura scaricata.
Riferimento ufficiale: Chrome match-pattern documentation.
Tre estensioni lo dichiarano esplicitamente. Due ci arrivano senza nominarlo: <all_urls> include lo schema file:.
| Estensione | In che modo raggiunge file:// | Nominato in manifest? | Dove |
|---|---|---|---|
| Magical | corrisponde a file:///* — tutti i file locali 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 grazie al wildcard <all_urls> | — | nessuna voce specifica |
| Thunderbit (nostra) | semplicemente grazie al wildcard <all_urls> | — | nessuna voce specifica |
http://*/* e https://*/* non coprono file://; anche <all_urls> e *://*/* differiscono su questo punto. I cinque qui sopra sono quelli le cui dichiarazioni raggiungono quello schema in un modo o nell’altro — non a causa del tipo di wildcard scelto.
Chrome blocca tutto questo dietro un toggle per estensione, “Allow access to file URLs”, che è disattivato per impostazione predefinita, quindi la dichiarazione è una richiesta e non una concessione. Cinque su dieci è il conteggio corretto, e due di questi cinque non scrivono mai file:// in alcun punto del manifest: Axiom.ai e il nostro.
Questo conteggio include anche web_accessible_resources, non solo content script e host permission. Table Capture nomina lì file://*/*; omettere quel blocco lo collocherebbe erroneamente tra le estensioni i cui manifest raggiungono i file senza nominare lo schema.
Permessi che non vedi finché non vengono richiesti

optional_permissions vengono dichiarati in anticipo ma richiesti a runtime, quindi non compaiono nel prompt di installazione. Due estensioni li usano, e una è particolarmente rilevante.
| Estensione | optional_permissions | Quello che conta davvero |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts può eseguire script forniti dall’utente nei contesti della pagina dopo l’attivazione del gate di Chrome |
| Magical | downloads, webRequest | webRequest osserva il traffico di rete |
userScripts non è visibile finché non viene richiesto, e non compare a chi legge semplicemente il numero dei permessi.
Ha anche un gate che gli altri permessi in questa analisi non hanno, e ometterlo lo avrebbe fatto sembrare più ampio del reale. Dichiarare userScripts non basta per usarlo: Chrome richiede prima un’azione esplicita dell’utente. Prima di Chrome 138 era il Developer Mode, attivato globalmente in chrome://extensions. Da Chrome 138 in poi è un toggle per estensione Allow User Scripts nella pagina dei dettagli di quella singola estensione, disattivato di default. Quindi, in un’installazione normale, la capacità è dichiarata ma inattiva. La formulazione corretta è condizionata: Table Capture può rendere disponibile l’API userScripts dopo che l’utente abilita il gate di Chrome. Questa analisi non ha misurato quante persone visitino quella pagina di impostazioni o attivino il toggle.
Né l’uno né l’altro sono nascosti; entrambi sono nel manifest. Una tabella che ignora il blocco facoltativo sottostima due prodotti.
Il momento dell’iniezione, non solo l’ambito
Non viene quasi mai considerato come viene iniettato un content script, e questo cambia il quadro. document_start è il primo hook offerto da Chrome; all_frames raggiunge gli embed di terze parti.
Tutto ciò nel gruppo che inietta staticamente in tutti i frame, ordinato per timing dichiarato:
| Estensione | run_at | all_frames | Pattern di corrispondenza del content script |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html più 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ù ampia copertura http e https |
| TexAu | document_idle (non impostato) | ✅ | quattordici pattern nominati |
Table Capture e Listly usano l’hook più precoce su pattern ampi. Axiom.ai e Clay for Chrome usano lo stesso timing ma solo sui propri domini — stessa aggressività, target ristretto.
Per le dichiarazioni statiche, <all_urls> più all_frames rappresenta il massimo dell’ampiezza di corrispondenza, e sia Table Capture sia Thunderbit si collocano lì. Il timing dichiarato però differisce: 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 si possono dedurre da questa tabella.
Un semplice conteggio dei permessi è una pessima statistica riassuntiva. Table Capture dichiara quattro permessi — meno della maggior parte qui — e inietta in document_start in tutti i frame su <all_urls>, oltre a userScripts su richiesta.
Chi è autorizzato a messaggiare l’estensione
externally_connectable controlla quali pagine web o altre estensioni possono inviare messaggi direttamente al service worker 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 restringere.
Letto così, la tabella si inverte:
| 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 da una baseline chiusa |
| Axiom.ai | sette origini web, nessun 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" |
Il default permissivo dipende dall’assenza dell’intera chiave. Una volta presente la chiave, entrambi i sotto-campi partono chiusi e specificare valori amplia ciascun canale.
Axiom.ai dichiara la chiave con solo matches. Il suo ids è quindi non impostato, il che significa che nessuna estensione può messaggiarlo — il canale estensione è chiuso, non 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 altre sono localhost, 0.0.0.0, un host Google APIs e una grande piattaforma social che non controlla.
Hexomatic apre il canale estensione a otto ID nominati. Con la chiave presente, la baseline è zero estensioni; nominarne otto lo 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 semplice — tutto ciò che risponde su quelle porte sulla macchina dell’utente rientra nella allowlist.
Sette su dieci omettono del tutto la chiave, incluso il nostro, e sono quelli che restano nel default permissivo per la messaggistica estensione-estensione. Due estensioni chiudono quel canale: Magical esplicitamente con ids: [], e Axiom.ai dichiarando la chiave e non menzionando mai ids. Magical è l’unica che chiude entrambi.
Quest’ultima riga è il motivo per cui conviene 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 rappresentano accesso ai tuoi account presso altre aziende — un tipo di reach diverso da tutto quanto sopra, e che nessun conteggio di permessi riflette.
Riferimento ufficiale: Google OAuth 2.0 scope list.
| Estensione | Scope oauth2 richiesti |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| Altre sette, inclusa la nostra | nessuno dichiarato |
https://www.googleapis.com/auth/drive è quello ampio. Google offre uno scope più ristretto, drive.file, che consente accesso solo ai file creati dall’app stessa o selezionati esplicitamente dall’utente; auth/drive significa vedere, modificare, creare ed eliminare su tutto Google Drive dell’utente. auth/spreadsheets ha la stessa forma per ogni foglio di calcolo raggiungibile dall’account. Sia Axiom.ai sia Table Capture abbinano uno scope dell’account Google all’accesso alle pagine <all_urls>.
Due limiti su 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 l’OAuth svolto tramite il flusso identity di Chrome; un’estensione che ti rimanda invece a una pagina web di login non dichiarerebbe nulla qui. Gli zeri delle sette righe significano “non richiesto in questo file”, non “nessun accesso al tuo account Google” — incluso il nostro, ed è per questo che questo asse viene riportato e non usato per sostenere una presunta ristrettezza.
La nostra estensione, sulla stessa scala
Thunderbit 4.6.4 ha attraversato lo stesso parser dei manifest delle altre nove. Il pacchetto pesa 15.9 MiB scompattato in 78 file.
Comportamento statico dichiarato: <all_urls> compare sia negli host permission 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 i file locali dopo che l’utente abilita il toggle di Chrome per l’accesso ai file. Thunderbit inoltre omette externally_connectable, quindi il default di Chrome consente messaggi da qualsiasi estensione ma non da pagine web.
Ceiling 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 di livello superiore del manifest e non ha effetto come voce in questo array. Thunderbit è l’unica estensione del gruppo a dichiarare debugger, che può agganciare 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 che Thunderbit invochi un particolare metodo CDP o registri uno script in un momento specifico e precedente.
Questa distinzione blocca diversi confronti allettanti ma non validi. L’assenza di un permesso più ristretto come cookies non limita ciò che potrebbe leggere del codice che dispone di 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 siano usati. Rispondere a una di queste domande richiede ispezione del codice 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 nel default di Chrome per la messaggistica tra estensioni. Non esiste un unico ranking di “più forte” perché l’analisi non fornisce un modello di minaccia comune tra CDP, OAuth, userScripts, clipboard e accesso agli host.
Il design sobrio che nessuno pubblicizza
TexAu pesa 0.3 MiB — il più piccolo del gruppo di un fattore 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 business 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 disclosure del prodotto — la lista dei target dice più chiaramente di cosa serve lo strumento rispetto al marketing.
Il compromesso esiste davvero: una lista nominata non può fare scraping di un sito che non è incluso, e ogni nuovo target richiede una release. Ma “quattordici domini nominati” e “qualsiasi URL esistente” sono proposte molto diverse, e solo una delle due è leggibile.
Due prodotti che non corrispondevano a 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 di estensione — la risposta per qualcosa che lo store non serve in modo anonimo. La sua pagina di listing, invece, è stata servita in modo anonimo — HTTP 200, 509.829 byte. Ciò che la cattura non ha potuto trovare lì è stato un numero di versione, una data di ultimo aggiornamento o il conteggio delle installazioni; gli appunti dello script dicono che un null in quel punto è una prova debole, e non è stata osservata alcuna barriera di login. L’ID è reale e first-party, quindi la lettura più probabile è una distribuzione solo via link o non elencata, ma non sono riuscito a distinguerla da una rimozione dallo store e non voglio fare congetture.
Dataflow Kit non ha alcuna estensione Chrome. Il suo sito descrive una web app ospitata con selezione point-and-click e una REST API. Eppure era finita comunque in una shortlist di estensioni Chrome — ed è così che di solito nascono queste liste.
Obsolescenza e reach, visto che entrambi sono gratis da controllare
I metadati dello store aggiungono contesto alla selezione dei prodotti oltre ai permessi. Gli stessi campi sono stati raccolti per ogni estensione il 2026-07-30.
| Estensione | Versione 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 servito pubblicamente |
Tre prodotti non hanno rilasciato da oltre un anno, e Hexomatic da quasi due. Per le estensioni questo conta più che per le librerie: Chrome rilascia una stable circa ogni quattro settimane e la piattaforma delle estensioni continua a cambiare sotto i piedi. userScripts ha spostato il suo gate utente in Chrome 138; un’estensione rilasciata l’ultima volta nel 2024 è stata costruita contro un insieme di regole diverso da quello applicato oggi dal browser.
Due cose che questa tabella non è. I conteggi delle installazioni sono raggruppati da Google — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — quindi confrontano ordini di grandezza e nient’altro, e diversi prodotti pubblicizzano numeri più alti nel proprio marketing. Una data recente è un fatto sul rilascio, non un verdetto sulla qualità della manutenzione o sul rischio dei permessi.
Un sottoprodotto utile: la versione dello store coincide con la versione del manifest in tutti e dieci i pacchetti analizzati. I file CRX letti da questa analisi sono quelli che lo store distribuisce oggi, non copie obsolete.
La freschezza cambia quanto follow-up meriti una selezione; non cambia la semantica del manifest. Un’estensione con domini nominati, aggiornata un anno fa, può ancora esporre meno superficie di una con wildcard pubblicata ieri. Il pacchetto più recente può comunque essere la scelta migliore operativamente se segue tempestivamente i cambiamenti di Chrome. Per una shortlist, usa la data dello store per decidere cosa testare di nuovo, poi usa il manifest per stabilire cosa richiede una revisione più approfondita delle capacità. Non trasformare le due colonne in un unico punteggio.
Cosa non ti dice un manifest
Un permesso dichiarato è un limite massimo, 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. Per capire cosa accade davvero bisogna osservare il traffico di rete a runtime — un lavoro diverso, non svolto qui, e nulla di quanto sopra va letto come prova di uso improprio.
Revisione correlata: Chrome extension testability experiment.
Altri tre limiti:
- Chrome blocca gran parte di tutto questo. L’accesso ai file è disattivato di default;
activeTabè volutamente ristretto; i permessi facoltativi richiedono un prompt a runtime; l’utente vede l’elenco dei permessi all’installazione. - Permessi ampi sono spesso necessari. Uno strumento il cui compito è “estrarre una tabella da qualsiasi pagina” non può funzionare con una allowlist di domini nominati. Un perimetro ristretto a volte è disciplina, a volte è semplicemente un prodotto più piccolo.
- 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 per 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 a content script e host permission; è 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 sopra applicano queste regole in modo coerente.
Il totale dei permessi di Thunderbit distingue anche le stringhe grezze dai permessi Chrome riconosciuti. Il suo array ha nove voci, ma commands appartiene al livello superiore, quindi il conteggio effettivo usato qui è otto permessi riconosciuti più una stringa non riconosciuta. Infine, le dichiarazioni statiche content_scripts non provano che il codice chiami scripting.registerContentScripts o un metodo CDP. Quelle possibilità rientrano solo nella capacità runtime, mai nel comportamento osservato. I manifest grezzi, gli hash CRX e l’output del parser dovrebbero essere collegati in un’appendice della pubblicazione, così i lettori possono verificare queste normalizzazioni senza doversi fidare del testo.
Per una vera decisione di installazione, confronta almeno quattro dimensioni separatamente: quali pagine rientrano di default, quale azione esplicita dell’utente sblocca maggiore reach, quali API del browser o dell’account diventano disponibili e quali chiamanti esterni possono messaggiare l’estensione. Il modello activeTab di Agenty, i userScripts protetti di Table Capture, gli scope Drive di Axiom.ai e la dichiarazione debugger di Thunderbit non sono punti su una singola scala lineare. Sono risposte diverse a domande di rischio diverse.
Ecco quel confronto applicato a quattro design volutamente differenti:
| Estensione | Ambito delle pagine visibile nel manifest | Gate aggiuntivo | Capacità non-page in questa analisi | Posizione per i chiamanti esterni |
|---|---|---|---|---|
| Agenty | nessun host permission o content script statico | l’utente invoca 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 facoltativi | 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 su <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 e controllato da Chrome | dichiarati debugger, scripting, tabs e API browser correlate | chiave omessa: qualsiasi estensione può connettersi, nessuna pagina web può |
Questa tabella non produce comunque un vincitore. Il fatto che Agenty abbia un accesso statico ristretto alle pagine non dice nulla su come il suo backend gestisca 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 è inattiva finché l’utente non abilita il suo gate separato. Il permesso debugger di Thunderbit espone una superficie ampia di controllo del browser, ma il manifest non rivela quali domini o metodi CDP vengano chiamati dal codice. Ogni riga dice cosa va ispezionato dopo: traffico di rete a runtime, codice sorgente, flusso di consenso o tracce delle API del browser.

La stessa separazione è importante quando si legge il prompt di installazione di Chrome. Un semplice conteggio dei permessi non può mostrare timing, reach nei frame, scope OAuth, web_accessible_resources o una chiave externally_connectable omessa. Allo stesso modo, una dichiarazione ampia non è una prova di raccolta o esfiltrazione. L’output utile di un audit del manifest è un piano di test runtime prioritizzato: identifica la superficie dati, annota il gate utente, poi osserva se il percorso dichiarato viene davvero utilizzato.
Come leggere il proprio
Revisione correlata: browser automation guide.
chrome://extensions→ Dettagli mostra l’accesso ai siti concesso e permette di impostarlo su su clic per tutto ciò che non richiede accesso permanente. Questo restringe la metà legata all’accesso ai siti di quanto detto sopra. Non tocca però la messaggistica in ingresso (externally_connectableraggiunge comunque il service worker) né i permessi a livello browser. La dichiarazionedebuggerdi Thunderbit è importante qui. La documentazione sulla 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 “su clic” non limita ciò che può raggiungere. E questo controllo non incide sutabs,webNavigation,clipboardRead,downloadso qualsiasi elemento inoptional_permissions.- Per il file grezzo, il pacchetto si trova nella directory
Extensions/<id>/<version>/di Chrome. Leggi sei campi:permissions,optional_permissions,host_permissions,content_scripts(imatches,run_ateall_framesal loro interno),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 contiene due voci<all_urls>che espongonoindex.htmle due script bundled a qualsiasi origine, conuse_dynamic_url: false, il che consente a una pagina di verificare se quegli URL stabili dell’estensione si risolvono. - Confronta la data dell’ultimo aggiornamento della scheda nello store con la 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 open-source scraper pillar copre gli strumenti non basati su estensioni.
Prova Thunderbit per l’estrazione di dati dal web
La versione breve
Dieci estensioni per scraping e automazione, inclusa la nostra, sono state lette nei rispettivi manifest.
Agenty dichiara nessun accesso ai siti e nessun content script, e funziona solo sulla scheda che stai guardando quando lo clicchi, in 2.2 MiB. Axiom.ai dichiara ogni URL HTTP e HTTPS su 37.1 MiB. Magical dichiara tredici permessi incluso clipboardRead — ed è anche l’unica estensione qui che chiude completamente la messaggistica in ingresso. Table Capture dichiara solo quattro permessi e inietta a document_start in tutti i frame su <all_urls> — lo stesso limite massimo di corrispondenza che raggiungiamo noi, ma prima — più userScripts su richiesta. TexAu è il più piccolo e nomina più target di tutti — quattordici pattern su tredici proprietà distinte. Non è l’unico 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’unico la cui lista nominata è in larga parte composta da siti altrui. Cinque su dieci possono raggiungere i file locali, e due di questi — Axiom.ai e il nostro — senza mai scrivere file://.
Thunderbit, il nostro, si colloca all’estremo più ampio: <all_urls> sia per l’accesso agli host sia per l’iniezione statica, più debugger, che nessun’altra estensione di questo gruppo dichiara. Si colloca nel default di Chrome che consente messaggi da qualsiasi estensione e raggiunge file:// dopo che il gate di Chrome per l’accesso ai file è stato abilitato.
Una dichiarazione è un limite massimo, non un comportamento, e nulla di tutto questo dimostra un uso improprio. Ma è pubblico, è gratuito da verificare, e la distanza tra i due estremi è più grande di qualunque cosa mostrata nelle pagine prodotto.
Prova Thunderbit per l’estrazione di dati dal web Get Started Free
FAQ
Un permesso ampio significa che l’estensione sta facendo qualcosa di sbagliato — e perché il semplice conteggio dei permessi non basta?
No, e perché il conteggio non coglie due aspetti. <all_urls> significa che un’estensione può leggere ogni pagina visitata; non dice nulla su cosa faccia davvero o se qualcosa lasci il dispositivo, e uno strumento costruito per estrarre dati da qualsiasi pagina non può realisticamente funzionare con una lista di domini nominati. Il risultato rilevante è la varietà del perimetro, non una condotta scorretta — per accertare il comportamento reale serve un’analisi del traffico a runtime, che questa analisi non ha svolto. 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 optional_permissions non compaiono affatto nel prompt di installazione — Table Capture può richiedere userScripts a runtime, che permette di eseguire script arbitrari forniti dall’utente nei contesti della pagina, e Magical può richiedere webRequest.
Quale di queste chiede meno?
Agenty: quattro permessi, nessun host permission, nessun content script. Si basa su activeTab, che concede accesso alla scheda corrente solo dopo aver cliccato sull’estensione e solo finché non si cambia 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 da nessuna parte. http://*/* e https://*/* non coprono file://. Chrome mantiene l’accesso ai file disattivato per 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 le origini web o gli ID di estensione autorizzati a messaggiare il background script di un’estensione. Il default di Chrome quando la chiave è assente è che qualsiasi estensione può connettersi e nessuna pagina web può farlo. Sette di queste dieci la omettono, inclusa Thunderbit. Con la chiave presente, Hexomatic apre il canale estensione a otto ID nominati; Axiom.ai apre sette origini web lasciando chiuso il canale estensione; Magical dichiara elenchi vuoti per entrambi, chiudendo entrambi i canali.
Cosa dichiara il manifest di Thunderbit?
<all_urls> per accesso agli host e iniezione statica del content script, in all_frames a document_end; 15.9 MiB 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 di manifest di livello superiore e non ha effetto in quell’array. Nessun’altra estensione di questo gruppo dichiara debugger. Thunderbit raggiunge inoltre file:// tramite <all_urls> dopo che il gate di Chrome per l’accesso ai file è stato abilitato, e omette externally_connectable. Il comportamento runtime non è stato eseguito, quindi l’analisi non sostiene quali metodi CDP o di scripting l’estensione utilizzi davvero.


