Elke Chrome-extensie levert een manifest.json mee. Daarin staat een groot deel van wat de extensie op browserniveau kan: aangevraagde API’s, hostpatronen, statische content scripts, optionele rechten en toegestane externe verbindingen. Dit is een openbaar bestand in het pakket dat je installeert. Het bewijst niet welke gedeclareerde mogelijkheden de runtime-code echt gebruikt, wat er van de machine afgaat, of welke accounttoegang via een aparte weblogin loopt.
Ik heb de tien scraping- en browserautomatiseringsextensies gelezen die voor deze audit zijn geselecteerd, waaronder die van Thunderbit — en dat is de onze. De verschillen zijn groot. Eén extensie declareert geen vaste toegang tot sites. Een andere declareert dertien rechten, inclusief clipboardRead. Thunderbit is de enige extensie in deze set die debugger opgeeft: een brede CDP-koppeling met een ander risicoprofiel dan paginatoegang, OAuth of door de gebruiker aangeleverde scripts.
Dat is geen beschuldiging. Een breed recht is vaak simpelweg de eerlijke manier om een bepaalde functie te bouwen, en een smal recht kan betekenen dat het product gewoon minder kan. Het punt is dat het verschil enorm is, publiek zichtbaar is, en nooit in een vergelijkingstabel terechtkomt.
Hoe dit is gedaan
Elke extensie is als .crx gedownload via Googles eigen update-endpoint — dezelfde URL die Chrome zelf gebruikt — en daarna uitgepakt en geanalyseerd. Geen enkele extensie is geïnstalleerd en er is geen extensiecode uitgevoerd. Dit is een lezing van een JSON-bestand.
De downloads werden gespreid met ongeveer één request per twee seconden. Van elke .crx, de SHA-256 en het geëxtraheerde manifest.json zijn artefacten bewaard. Thunderbit is via precies hetzelfde script gegaan als de andere negen, niet via een zijpad, dus de rij voor Thunderbit is exact op dezelfde manier afgeleid.
De analyse gebruikt twee bewijssoorten en houdt die strikt gescheiden:
- Gedeclareerd statisch gedrag: hostpatronen en
content_scripts-vermeldingen, inclusiefmatches,run_atenall_frames. - Mogelijkheden die beschikbaar zijn voor runtime-code: API’s die in
permissionsofoptional_permissionsstaan. Deze verklaringen laten zien wat code zou kunnen opvragen of aanroepen, niet dat het dat ook doet.
Er wordt geen rangorde voor "meest krachtig" toegekend. debugger, userScripts, brede hosttoegang, OAuth-scopes, clipboardtoegang en externe messaging geven allemaal andere data prijs en kennen andere voorwaarden. Ze vergelijken vereist een dreigingsmodel dat deze manifest-only audit niet biedt.
De groottes hieronder zijn uitgepakte totalen in MiB (2²⁰ bytes), opgeteld uit de ZIP-entries.
Stand per 2026-07-29. Extensies worden bijgewerkt; controleer opnieuw vóór je citeert.
Wat tien manifests verklaren

Officiële referentie: Chrome's permission declaration guide.
| Extensie | Versie | Uitgepakt | Bestanden | Rechten | Sitetoegang | Toegang tot file:// |
|---|---|---|---|---|---|---|
| Axiom.ai | 5.1.0 | 37.1 MiB | 232 | 8 | http://*/* + https://*/* | ✅ |
| Table Capture | 11.0.41 | 21.1 MiB | 115 | 4 (+3 optioneel) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16.8 MiB | 395 | 13 (+2 optioneel) | <all_urls> | ✅ |
| Thunderbit (onze) | 4.6.4 | 15.9 MiB | 78 | 8 herkende (+1 niet-herkende arraystring: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6.3 MiB | 51 | 6 | *://*/* (injecteert alleen op eigen domein) | — |
| Listly | 0.9.6 | 3.5 MiB | 84 | 7 | http://*/*, https://*/*, file:///*.html | ✅ |
| Hexomatic | 1.8.4 | 2.7 MiB | 37 | 2 | alleen eigen domeinen | — |
| Agenty | 2.9.7 | 2.2 MiB | 49 | 4 | geen gedeclareerd | — |
| Clip to Clay | 1.8.0 | 0.7 MiB | 16 | 4 | 2 benoemde domeinen | — |
| TexAu v2 | 1.6.6 | 0.3 MiB | 12 | 6 | 14 benoemde domeinen | — |
Twee meer stonden op de kandidatenlijst en staan niet in de tabel, om redenen die op zichzelf het vermelden waard zijn.
De spreiding is een ontwerpkeuze, geen gevolg van grootte
Agenty declareert geen hostrechten en levert helemaal geen content scripts mee. De vier rechten zijn activeTab, scripting, identity en identity.email. activeTab is de smalle variant: het geeft toegang tot het huidige tabblad pas nadat je op de extensie klikt, en alleen totdat je verder navigeert. Er draait niets op je pagina’s tenzij je het zelf activeert. En dat alles in 2.2 MiB.
Axiom.ai declareert http://*/* en https://*/*, injecteert content scripts die op <all_urls> matchen, en pakt uit tot 37.1 MiB over 232 bestanden — zeventien keer zo groot als Agenty, met vaste toegang tot elke pagina die je bezoekt.
Hexomatic zit dichter bij Agenty: twee rechten (storage, tabs), geen hostrechten, en content scripts die beperkt zijn tot de twee eigen domeinen.
Clay for Chrome heeft een derde vorm die je apart moet zien: het declareert *://*/* als hostrecht, maar injecteert content scripts alleen op het eigen domein. De vaste mogelijkheid is breed; het automatische gedrag is smal. Een permissietabel gooit die twee door elkaar.
Vijf van de tien kunnen bestanden op je schijf bereiken
file:/// is geen website. Het is je lokale bestandssysteem dat in een browsertab wordt weergegeven — een PDF die je hebt geopend, een HTML-export, een gedownloade factuur.
Officiële referentie: Chrome match-pattern documentation.
Drie extensies zeggen dat expliciet. Twee komen er zonder het te noemen bij: <all_urls> omvat het file:-schema.
| Extensie | Hoe het file:// bereikt | Noemt file:// in het manifest? | Waar |
|---|---|---|---|
| Magical | matcht file:///* — elk lokaal bestand dat Chrome kan weergeven, niet alleen HTML — in vier van de zes content-scriptvermeldingen | ✅ | content scripts en web_accessible_resources |
| Listly | matcht file:///*.html | ✅ | content scripts |
| Table Capture | <all_urls> content scripts, en het noemt het schema ook expliciet | ✅ | web_accessible_resources |
| Axiom.ai | puur via de wildcard <all_urls> | — | nergens |
| Thunderbit (onze) | puur via de wildcard <all_urls> | — | nergens |
http://*/* en https://*/* dekken file:// niet; <all_urls> en *://*/* verschillen hier ook op. De vijf hier zijn de extensies waarvan de verklaringen het schema via de ene of de andere route bereiken — niet omdat ze toevallig die wildcardvorm kozen.
Chrome zet dit alles achter een per-extensie schakelaar "Allow access to file URLs" die standaard uit staat, dus de declaratie is een verzoek en geen directe toekenning. Vijf van de tien is de eerlijke telling, en twee van die vijf schrijven nergens file:// in hun manifest: Axiom.ai en de onze.
Deze telling omvat ook web_accessible_resources, niet alleen content scripts en hostrechten. Table Capture noemt daar file://*/*; dat blok weglaten zou het onterecht onder extensies zetten die bestanden bereiken zonder het schema te noemen.
Rechten die je pas ziet als ze worden opgevraagd

optional_permissions worden vooraf gedeclareerd maar pas tijdens runtime opgevraagd, dus ze verschijnen niet in de install-prompt. Twee extensies gebruiken ze, en één daarvan is belangrijk.
| Extensie | optional_permissions | De relevante |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts kan door de gebruiker aangeleverde scripts in page contexts draaien nadat Chrome's gebruikersgate is ingeschakeld |
| Magical | downloads, webRequest | webRequest observeert netwerkverkeer |
userScripts is afwezig totdat het wordt aangevraagd, en onzichtbaar voor iedereen die alleen een telstaat van rechten leest.
Het heeft ook een gate die de andere rechten in deze audit niet hebben, en dat weglaten zou het beeld overschatten. Alleen het declareren van userScripts is niet genoeg om het te gebruiken: Chrome vereist eerst een expliciete gebruikersactie. Voor Chrome 138 was dat Developer Mode, globaal aan te zetten op chrome://extensions. Vanaf Chrome 138 is het een per-extensie schakelaar Allow User Scripts op de detailpagina van die extensie, standaard uit. Voor een normale installatie is de mogelijkheid dus wel gedeclareerd, maar inactief. De precieze claim is voorwaardelijk: Table Capture kan de userScripts-API beschikbaar maken nadat de gebruiker Chrome’s gate inschakelt. Deze audit heeft niet gemeten hoe vaak gebruikers die instellingenpagina bezoeken of de schakelaar aanzetten.
Geen van beide is verborgen; beide staan in het manifest. Een tabel die het optionele blok negeert, onderschat twee producten.
Injectietiming, niet alleen bereik
Hoe een content script wordt geïnjecteerd, krijgt vaak geen aandacht maar verandert het beeld. document_start is de vroegste hook die Chrome biedt; all_frames bereikt embeds van derden.
Alles in de set dat statisch in alle frames injecteert, gerangschikt op gedeclareerde timing:
| Extensie | run_at | all_frames | Content-script matchpatroon |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html plus alle http en https |
| Axiom.ai | document_start | ✅ | alleen eigen domeinen |
| Clay for Chrome | document_start | ✅ | alleen eigen domeinen |
| Thunderbit (onze) | document_end | ✅ | <all_urls> |
| Magical | document_idle | ✅ | file:///* plus brede http en https |
| TexAu | document_idle (niet ingesteld) | ✅ | veertien benoemde patronen |
Table Capture en Listly gebruiken de vroegste hook over brede matchpatronen. Axiom.ai en Clay for Chrome gebruiken dezelfde timing, maar alleen op hun eigen domeinen — dezelfde agressiviteit, smalle doelgroep.
Voor statische verklaringen is <all_urls> plus all_frames het plafond van match-breedte, en zowel Table Capture als Thunderbit zitten daar. Hun gedeclareerde timing verschilt: Table Capture gebruikt document_start; Thunderbit’s statische content script gebruikt document_end. Runtime-API’s zijn een aparte categorie en kunnen niet uit deze tabel worden afgeleid.
Een telling van rechten is een slechte samenvattende statistiek. Table Capture declareert vier rechten — minder dan de meeste hier — en injecteert bij document_start in alle frames op <all_urls>, plus op verzoek userScripts.
Wie de extensie mag aanspreken
externally_connectable bepaalt welke webpagina’s of andere extensies rechtstreeks berichten mogen sturen naar de background script van een extensie. De standaard is minder intuïtief dan je denkt.
Het weglaten van de sleutel is de permissieve instelling. Volgens Chrome is de standaard wanneer externally_connectable ontbreekt dat elke extensie mag verbinden, terwijl geen enkele webpagina dat mag. Het declareren ervan is juist hoe je beperkt.
Op basis daarvan draait de tabel om:
| Extensie | externally_connectable-declaratie | Wie mag het berichten sturen |
|---|---|---|
| Agenty | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Clay for Chrome | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Clip to Clay | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Listly | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Table Capture | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| TexAu | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Thunderbit (onze) | weggelaten | Permissieve standaard — elke extensie mag verbinden, geen webpagina mag dat |
| Hexomatic | acht extensie-ID's en zes weborigins | Opent beide kanalen vanuit een gesloten basis |
| Axiom.ai | zeven weborigins, geen ids | Extensiekanaal gesloten, zeven webpagina's geopend |
| Magical | {"ids": [], "matches": []} | De enige extensie hier die beide kanalen expliciet sluit |
Chrome’s regel heeft twee lagen. Uit de manifestreferentie:
| Situatie | Wie mag verbinden |
|---|---|
| de hele sleutel is afwezig | "all extensions can connect, but no web pages can connect" |
sleutel aanwezig, ids niet ingesteld of [] | "no extensions or apps can connect" |
sleutel aanwezig, matches niet ingesteld of [] | "no web pages can connect" |
De permissieve standaard hoort bij de afwezigheid van de hele sleutel. Zodra de sleutel aanwezig is, beginnen beide subvelden gesloten en maakt het benoemen van waarden elk kanaal ruimer.
Axiom.ai declareert de sleutel met alleen matches. De ids zijn dus niet ingesteld, wat betekent dat geen enkele extensie het mag berichten — het extensiekanaal is gesloten, niet open gelaten. Wat het wél opende zijn zeven weborigins, waarvan er maar één een Axiom-domein is: twee zijn niet-toerekenbare derde partijen (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) en de rest zijn localhost, 0.0.0.0, een Google APIs-host en één groot sociaal platform dat het niet beheert.
Hexomatic opent het extensiekanaal naar acht benoemde ID’s. Met de sleutel aanwezig is de basis nul extensies; acht benoemen maakt daarvan acht. De zes matches verbreden het andere kanaal vanuit niets, en twee daarvan zijn http://localhost:8000/* en http://localhost:3000/* over gewone HTTP — alles wat op die poorten antwoordt op de machine van de gebruiker valt binnen de allowlist.
Zeven van de tien laten de sleutel helemaal weg, inclusief de onze, en dat zijn de extensies die op de permissieve standaard staan voor messaging tussen extensies. Twee sluiten dat kanaal: Magical expliciet met ids: [], en Axiom.ai door de sleutel te declareren en ids nooit te noemen. Magical is de enige die beide sluit.
Die laatste regel is precies waarom je manifests moet lezen in plaats van alleen rechten tellen. Dezelfde extensie kan op de ene as breed zijn en op een andere as juist de strengste van de set.
De as die niemand telt: OAuth-scopes
Een manifest kan een oauth2-blok bevatten, en de scopes daarin geven toegang tot je accounts bij andere bedrijven — een ander soort bereik dan alles hierboven, en iets wat geen enkele rechten-telling weergeeft.
Officiële referentie: Google OAuth 2.0 scope list.
| Extensie | Opgevraagde oauth2-scopes |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| De andere zeven, inclusief de onze | niets gedeclareerd |
https://www.googleapis.com/auth/drive is de brede variant. Google biedt een smallere drive.file-scope die alleen toegang geeft tot bestanden die de app zelf maakt of die de gebruiker expliciet kiest; auth/drive betekent lezen, bewerken, aanmaken en verwijderen in de hele Drive van de gebruiker. auth/spreadsheets heeft dezelfde vorm voor elke spreadsheet waar het account bij kan. Zowel Axiom.ai als Table Capture combineren een Google-accountscope met <all_urls>-toegang tot pagina’s.
Twee beperkingen op wat deze tabel bewijst. Een scope wordt aangevraagd, niet toegekend — Google toont een toestemmingsscherm en de gebruiker kan weigeren, en de extensie kan de API misschien nooit aanroepen. En het manifest ziet alleen OAuth via Chrome’s identity-flow; een extensie die je in plaats daarvan naar een web-inlogpagina stuurt, declareert hier niets. De zeven nullen betekenen "niet aangevraagd in dit bestand", niet "geen toegang tot je Google-account" — ook niet voor de onze, en juist daarom wordt deze as gerapporteerd in plaats van als smalheid geclaimd.
Onze eigen extensie, op dezelfde schaal
Thunderbit 4.6.4 is via exact dezelfde manifestparser gegaan als de andere negen. Het pakket is 15.9 MiB uitgepakt over 78 bestanden.
Gedeclareerd statisch gedrag: <all_urls> staat zowel in de hostrechten als in de content-script-matches. Het statische script draait in all_frames bij document_end. Omdat <all_urls> file: omvat, kan het manifest lokale bestanden bereiken zodra de gebruiker Chrome’s bestandstoegangsschakelaar aanzet. Thunderbit laat ook externally_connectable weg, dus Chrome’s standaard staat berichten toe van elke extensie maar niet van webpagina’s.
Runtime-mogelijkheden als plafond: de permissions-array bevat negen strings: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups en tabs. Chrome herkent er acht als rechten; commands is een sleutel op topniveau in het manifest en heeft geen effect als invoer in deze array. Thunderbit is de enige extensie in de set die debugger declareert, wat CDP aan een tab kan koppelen. Het manifest maakt ook scripting beschikbaar voor runtime-registratie. Die API’s creëren mogelijkheden die verder gaan dan de statische document_end-rij, maar uit een manifestlezing kun je niet vaststellen dat Thunderbit een bepaalde CDP-methode aanroept of een script op een eerder moment registreert.
Dat onderscheid blokkeert een paar verleidelijke maar onjuiste vergelijkingen. Het ontbreken van een smallere cookies-permission begrenst niet wat code met debugger mogelijk kan zien. Het ontbreken van clipboardRead is geen bewijs dat clipboardtoegang onmogelijk is. Omgekeerd is het feit dat debugger aanwezig is geen bewijs dat die routes ook gebruikt worden. Voor elk van die vragen heb je broninspectie of runtime tracing nodig, en dat is hier niet gedaan.
Op dit instrument is Thunderbit breed in statische sitetoegang, uniek binnen deze set door debugger te declareren, en zit het op Chrome’s standaard voor messaging tussen extensies. Er bestaat geen enkele "sterkste" rangorde, omdat de audit geen gemeenschappelijk dreigingsmodel biedt over CDP, OAuth, userScripts, clipboard en hosttoegang.
Het ingetogen ontwerp dat niemand verkoopt
TexAu is 0.3 MiB — het kleinste hier met een factor twee — en het noemt veertien specifieke sites in plaats van een wildcard te gebruiken: sociale netwerken, een developerplatform, publicatieplatforms, een chatproduct, een aanbieder van bedrijfsdata en zijn eigen domein. De content scripts matchen precies dezelfde veertien.
Je kunt dit manifest lezen en exact zien waar de extensie actief is. Het is ook een productopenbaring — de doelgroepenlijst zegt duidelijker waar het hulpmiddel voor is dan de marketing dat doet.
De trade-off is echt: een benoemde lijst kan geen site scannen die er niet op staat, en elke nieuwe target heeft een release nodig. Maar "veertien benoemde domeinen" en "elke URL die bestaat" zijn twee heel verschillende proposities, en slechts één daarvan is leesbaar.
Twee producten die niet bleken te zijn wat de lijst zei
De extensie van Captain Data wordt niet publiek verspreid. Googles update-endpoint geeft voor de extensie-ID HTTP 204 met een lege body terug — de respons van iets dat de store niet anoniem wil leveren. De listingpagina zelf werd daarentegen anoniem geserveerd — HTTP 200, 509.829 bytes. Wat de capture er niet in kon vinden waren een versiestring, een laatst-bijgewerkt-datum of een installatietelling; in de notities van het script staat dat een null daar zwak bewijs is, en er werd geen inlogmuur waargenomen. De ID is echt en afkomstig van de eerste partij, dus levering via link-only of niet-openbare distributie is de meest waarschijnlijke lezing, maar ik kon dat niet onderscheiden van delisting en ga niet gokken.
Dataflow Kit heeft helemaal geen Chrome-extensie. Hun site beschrijft een gehoste webapp met point-and-click selectie en een REST API. Toch stond het op een shortlist voor Chrome-extensies — en zo worden dit soort lijsten meestal gemaakt.
Veroudering en bereik, omdat beide gratis te controleren zijn
Store-metadata geeft extra context voor productselectie naast de rechten. Dezelfde velden zijn op 2026-07-30 voor elke extensie vastgelegd.
| Extensie | Store-versie | Laatst bijgewerkt | Installatiebucket |
|---|---|---|---|
| Thunderbit (onze) | 4.6.4 | 28 juli 2026 | 200.000 |
| Listly | 0.9.6 | 25 juli 2026 | 100.000 |
| Axiom.ai | 5.1.0 | 20 juli 2026 | 100.000 |
| Table Capture | 11.0.41 | 26 juni 2026 | 200.000 |
| Magical | 3.119.1 | 4 april 2026 | 200.000 |
| Agenty | 2.9.7 | 8 februari 2026 | 10.000 |
| TexAu | 1.6.6 | 20 augustus 2025 | 7.000 |
| Clay for Chrome | 1.0.0 | 9 april 2025 | 10.000 |
| Clip to Clay | 1.8.0 | 8 april 2025 | 1.000 |
| Hexomatic | 1.8.4 | 6 september 2024 | 3.000 |
| Captain Data | — | — | niet publiek geserveerd |
Drie producten hebben al meer dan een jaar niets uitgebracht, en Hexomatic bijna twee. Voor extensies maakt dat meer uit dan voor libraries: Chrome brengt ongeveer elke vier weken een stabiele release uit en het extensieplatform verandert ondertussen gewoon door. userScripts verschoof zijn gebruikersgate in Chrome 138; een extensie die voor het laatst in 2024 verscheen, is gebouwd tegen een andere set regels dan de browser die die regels nu afdwingt.
Twee dingen die deze tabel niet is. Installatietellingen zijn door Google gebucket — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — dus ze vergelijken alleen ordegroottes en niets fijner, en verschillende producten adverteren in hun eigen marketing hogere cijfers. Een recente datum is een feit over shipping, geen oordeel over onderhoudskwaliteit of risico van rechten.
Een nuttig neveneffect: de store-versie komt bij alle tien geanalyseerde pakketten overeen met de manifestversie. De CRX-bestanden die deze audit heeft geparset, zijn dus de bestanden die de store vandaag levert, niet verouderde kopieën.
Versheid bepaalt hoeveel follow-up een selectie verdient; het verandert de manifestsemantiek niet. Een extensie met benoemde domeinen die een jaar geleden is bijgewerkt, kan nog steeds minder paginavlak blootstellen dan een wildcard-extensie die gisteren verscheen. Het nieuwere pakket kan operationeel alsnog de betere keuze zijn als het Chrome-wijzigingen snel volgt. Gebruik voor een shortlist de store-datum om te bepalen wat opnieuw getest moet worden, en gebruik daarna het manifest om te bepalen wat een diepere capability-review nodig heeft. Maak van die twee kolommen geen enkele score.
Wat een manifest je niet vertelt
Een gedeclareerd recht is een plafond, geen gedrag. <all_urls> betekent dat een extensie mag lezen wat er op elke pagina staat. Het betekent niet dat ze dat doet, of dat er iets van je machine weggaat. Vaststellen wat er werkelijk gebeurt vereist het live volgen van netwerkverkeer — ander werk, hier niet gedaan, en niets hierboven mag worden gelezen als bewijs van misbruik.
Gerelateerde review: Chrome extension testability experiment.
Drie extra grenzen:
- Chrome begrenst veel hiervan. Bestandstoegang staat standaard uit;
activeTabis bewust smal; optionele rechten vereisen een runtime-prompt; gebruikers zien bij installatie een rechtenlijst. - Brede rechten zijn vaak noodzakelijk. Een tool die "een tabel van elke pagina waar je bent" moet halen, kan niet werken met een lijst van benoemde domeinen. Smalle scope is soms discipline, en soms gewoon een kleiner product.
- Eén versie, één dag. Elk getal komt uit het pakket dat op 2026-07-29 werd geserveerd.
Materiële correcties in de analyse
De gepubliceerde tellingen gebruiken drie regels die makkelijk fout gaan als je snel een manifestparser schrijft. Ten eerste omvat <all_urls> het file:-schema, maar Chrome houdt echte bestandstoegang achter een door de gebruiker bediende schakelaar. Ten tweede moet web_accessible_resources.matches samen met content scripts en hostrechten worden bekeken; daar noemt Table Capture expliciet file://*/*. Ten derde heeft externally_connectable andere defaults afhankelijk van of de hele sleutel ontbreekt of de sleutel bestaat met een leeg subveld. De tabellen hierboven passen die regels consequent toe.
Thunderbit's permissietotaal maakt ook onderscheid tussen ruwe strings en herkende Chrome-rechten. De array heeft negen items, maar commands hoort op topniveau, dus de effectieve telling hier is acht herkende rechten plus één niet-herkende string. Tot slot zijn statische content_scripts-verklaringen geen bewijs dat code scripting.registerContentScripts of een CDP-methode aanroept. Die mogelijkheden verschijnen alleen onder runtime capability, nooit als waargenomen gedrag. Ruwe manifests, CRX-hashes en parser-output zouden als appendix bij publicatie moeten worden opgenomen, zodat lezers deze normalisaties kunnen controleren zonder op de tekst te hoeven vertrouwen.
Voor een echte installatier beslissing vergelijk je minstens vier dimensies apart: welke pagina’s standaard binnen bereik vallen, welke expliciete gebruikersactie meer bereik ontsluit, welke browser- of account-API’s beschikbaar komen, en welke externe callers de extensie mogen berichten. Agenty’s activeTab-model, Table Capture’s afgeschermde userScripts, Axiom.ai’s Drive-scope en Thunderbit’s debugger-declaratie zijn geen punten op één lineaire schaal. Het zijn verschillende antwoorden op verschillende dreigingsvragen.
Hier is die vergelijking toegepast op vier bewust verschillende ontwerpen:
| Extensie | Paginabereik zichtbaar in het manifest | Extra gate | Niet-pagina-capability in deze audit | Postuur voor externe callers |
|---|---|---|---|---|
| Agenty | geen hostrecht of statisch content script | gebruiker activeert activeTab op het huidige tabblad | Chrome identity-rechten | sleutel weggelaten: elke extensie mag verbinden, geen webpagina mag dat |
| Table Capture | statische scripts op <all_urls> in alle frames bij document_start | bestandstoegang staat standaard uit; userScripts heeft Chrome's aparte gebruikersgate nodig | optionele userScripts, downloads en identity | sleutel weggelaten: elke extensie mag verbinden, geen webpagina mag dat |
| Axiom.ai | HTTP- en HTTPS-wildcardtoegang; statische scripts bij document_start op eigen domeinen | OAuth-toestemming voor aangevraagde Google-scopes | gedeclareerde Drive- en Sheets-OAuth-scopes | extensiecallers gesloten; zeven weborigins geopend |
| Thunderbit | <all_urls>-hosttoegang en statische scripts in alle frames bij document_end | bestandstoegang staat standaard uit; koppelen van debugger heeft door Chrome gestuurd zichtbaar gedrag | debugger, scripting, tabs en verwante browser-API’s gedeclareerd | sleutel weggelaten: elke extensie mag verbinden, geen webpagina mag dat |
Deze tabel levert nog steeds geen winnaar op. Agenty’s smalle vaste paginatoegang zegt niets over wat de backend met ingestuurde data doet. Axiom.ai’s accountscopes zijn niet vergelijkbaar met een extensie die de huidige pagina leest. Table Capture’s userScripts-verklaring is inert totdat de gebruiker de aparte gate aanzet. Thunderbit’s debugger-recht opent een breed browsercontrolvlak, maar het manifest laat niet zien welke CDP-domeinen of methoden de code aanroept. Elke rij vertelt je wat je hierna moet inspecteren: runtime netwerkverkeer, broncode, toestemmingsflow of browser-API-traces.

Diezelfde scheiding is belangrijk bij het lezen van Chrome’s install-prompt. Een ruwe telling van rechten kan timing, framebereik, OAuth-scope, web_accessible_resources of een weggelaten externally_connectable-sleutel niet tonen. Omgekeerd is een brede declaratie geen bewijs van verzameling of exfiltratie. De nuttige output van een manifestaudit is een geprioriteerd runtime-testplan: identificeer het datavlak, noteer de gebruikersgate, en observeer vervolgens of de gedeclareerde route daadwerkelijk wordt gebruikt.
Hoe je je eigen extensie leest
Gerelateerde review: browser automation guide.
chrome://extensions→ Details laat de toegekende sitetoegang zien en laat je die op on click zetten voor alles wat geen vaste toegang nodig heeft. Daarmee beperk je de site-toegangskant van wat hierboven staat. Het raakt inkomende messaging niet (externally_connectablebereikt de service worker hoe dan ook), en het verandert browserniveau-rechten niet. Thunderbit’sdebugger-declaratie is hier relevant. Chromium’s eigen beveiligingsdocumentatie voor extensies zegt dat de debugger-API "may in some cases also sidestep other typical restrictions, such as host permissions or file access", dus sitetoegang op "on click" zetten begrenst niet wat het kan bereiken. Die instelling raakt ooktabs,webNavigation,clipboardRead,downloadsof iets inoptional_permissionsniet.- Voor het ruwe bestand staat het pakket onder Chrome’s map
Extensions/<id>/<version>/. Lees zes velden:permissions,optional_permissions,host_permissions,content_scripts(dematches,run_atenall_framesdaarin),externally_connectable— met in gedachten dat een afwezige sleutel permissief is voor extensiecallers — enweb_accessible_resources, waarvan dematchesschema’s kunnen noemen die de content scripts nooit noemen. Thunderbit’s laatste veld heeft twee<all_urls>-vermeldingen dieindex.htmlen twee meegeleverde scripts voor elk origine blootstellen, metuse_dynamic_url: false, waardoor een pagina kan testen of die stabiele extensie-URL’s resolven. - Controleer de laatst bijgewerkte datum in de listing tegen de huidige Chrome-versie.
Openbaarmaking en bronnen: dit artikel is gepubliceerd door Thunderbit, waarvan de extensie in dezelfde tabel en parser is opgenomen. Onze open-source scraper pillar behandelt niet-extensie-tools.
Probeer Thunderbit voor webdata-extractie
De korte versie
Tien scraping- en automatiseringsextensies, inclusief de onze, zijn uit hun eigen manifesten gelezen.
Agenty declareert geen sitetoegang en geen content scripts, en werkt alleen op het tabblad waar je op klikt, in 2.2 MiB. Axiom.ai declareert elke HTTP- en HTTPS-URL verspreid over 37.1 MiB. Magical declareert dertien rechten inclusief clipboardRead — en is bovendien de enige extensie hier die inkomende messaging volledig sluit. Table Capture declareert slechts vier rechten, en injecteert bij document_start in alle frames op <all_urls> — hetzelfde matchplafond dat de onze bereikt, maar eerder — plus op verzoek userScripts. TexAu is de kleinste, en noemt de meeste doelen — veertien patronen over dertien verschillende eigenschappen. Het is niet de enige die doelen noemt: Clip to Clay declareert er twee (clay.com en één extern domein), en Hexomatic en Clay for Chrome noemen hun eigen domeinen. TexAu is de enige waarvan de benoemde lijst grotendeels uit andermans sites bestaat. Vijf van de tien kunnen bestanden op je schijf bereiken, twee daarvan — Axiom.ai en de onze — zonder ooit file:// te schrijven.
Thunderbit, de onze, zit aan de brede kant: <all_urls> voor zowel hosttoegang als statische injectie, plus debugger, dat geen enkele andere extensie in deze set declareert. Het zit op Chrome’s standaard die berichten van elke extensie toestaat, en het bereikt file:// zodra Chrome’s gebruikersgate voor bestandstoegang is ingeschakeld.
Een declaratie is een plafond, geen gedrag, en niets hiervan toont misbruik. Maar het is publiek, gratis te controleren, en de spreiding tussen beide uiteinden is groter dan alles op de productpagina’s.
Probeer Thunderbit voor webdata-extractie Get Started Free
FAQ's
Betekent een breed recht dat de extensie iets fout doet — en waarom is alleen rechten tellen niet genoeg?
Nee, en omdat tellen twee dingen mist. <all_urls> betekent dat een extensie mag lezen wat er op elke pagina staat; het zegt niets over wat ze doet of iets de machine verlaat, en een tool die data uit elke pagina moet halen kan echt niet werken met alleen een lijst van benoemde domeinen. De bevinding is de spreiding, niet wangedrag — om echt gedrag vast te stellen heb je runtime traffic-analyse nodig, en die is hier niet gedaan. Wat de telling betreft: injectie-instellingen zijn geen rechten, dus Table Capture declareert er vier terwijl het bij document_start in all_frames injecteert en <all_urls> matcht. En optional_permissions verschijnen helemaal niet in de install-prompt — Table Capture kan userScripts op runtime aanvragen, waarmee willekeurige gebruikersscripts in page contexts kunnen draaien, en Magical kan webRequest aanvragen.
Welke vraagt het minst?
Agenty: vier rechten, geen hostrechten, geen content scripts. Het leunt op activeTab, dat alleen toegang geeft tot het huidige tabblad nadat je op de extensie hebt geklikt en alleen totdat je weg navigeert. Hexomatic komt daarna, met twee rechten en content scripts die beperkt zijn tot de eigen domeinen.
Hoe kan een extensie mijn lokale bestanden bereiken zonder file:// te declareren?
Omdat <all_urls> het file:-schema omvat. Listly, Magical en Table Capture noemen file://-patronen expliciet — Magical in zijn content scripts en Table Capture in web_accessible_resources. Axiom.ai en Thunderbit bereiken het via de wildcard zonder het ergens te noemen. http://*/* en https://*/* dekken file:// niet. Chrome laat bestandstoegang standaard uit via een per-extensie schakelaar, dus de declaratie is een verzoek en geen toekenning.
Wat is externally_connectable, en waarom is het weglaten daarvan de permissieve optie?
Het benoemt de weborigins of extensie-ID’s die een background script van een extensie mogen berichten. Chrome’s standaard wanneer de sleutel afwezig is, is dat elke extensie mag verbinden en geen enkele webpagina mag. Zeven van deze tien laten het weg, inclusief Thunderbit. Als de sleutel aanwezig is, opent Hexomatic het extensiekanaal naar acht benoemde ID’s; Axiom.ai opent zeven weborigins terwijl het extensiekanaal gesloten blijft; Magical declareert lege lijsten voor beide en sluit dus beide kanalen.
Wat verklaart Thunderbit’s eigen manifest?
<all_urls> voor hosttoegang en statische content-scriptinjectie, in all_frames bij document_end; 15.9 MiB over 78 bestanden; en negen strings in de rechtenarray. Acht daarvan zijn herkende rechten: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups en tabs. commands is een manifest-sleutel op topniveau en heeft geen effect in die array. Geen enkele andere extensie in deze set declareert debugger. Thunderbit bereikt ook file:// via <all_urls> nadat Chrome’s bestandstoegangsgate is ingeschakeld, en het laat externally_connectable weg. Runtimegedrag is niet uitgevoerd, dus de audit claimt niet welke CDP- of scriptingmethoden de extensie werkelijk aanroept.


