Bez přímého přístupu k webu, nebo kovolně na každou URL: Jaká oprávnění mají deset scraperových rozšíření

Naposledy aktualizováno August 19, 2026
Bez přímého přístupu k webu, nebo kovolně na každou URL: Jaká oprávnění mají deset scraperových rozšíření
AI shrnutí
Každé rozšíření pro Chrome obsahuje soubor manifest.json, který prozrazuje značnou část jeho schopností na úrovni prohlížeče: požadovaná API, host patterns, statické content scripts, volitelná oprávnění a povolená externí připojení. Jde o veřejný soubor v balíčku, který instalujete. Neprokazuje ale, která deklarovaná oprávnění skutečný kód používá, co odchází z počítače ani jaký přístup k účtu probíhá přes samostatné webové přihlášení. Prošel jsem deset vybraných rozšíření pro scraping a automatizaci v prohlížeči, včetně Thunderbit, které je naše. Rozptyl je velký.

Každé rozšíření pro Chrome obsahuje soubor manifest.json, který z velké části určuje jeho schopnosti na úrovni prohlížeče: vyžádaná API, vzory hostitelů, statické content scripts, volitelná oprávnění a povolená externí připojení. Je to veřejný soubor v balíčku, který instalujete. Neprokazuje však, které deklarované schopnosti runtime kód skutečně používá, co opouští váš počítač ani ke kterému účtu se přistupuje přes samostatné webové přihlášení.

Pro tuto analýzu jsem prošel deset rozšíření pro scraping a automatizaci v prohlížeči, včetně Thunderbit, které je naše. Rozptyl je velký. Jedno neuvádí žádný trvalý přístup ke stránkám. Jiné deklaruje třináct oprávnění včetně clipboardRead. Thunderbit je v této sadě jediné rozšíření, které deklaruje debugger — tedy širokou schopnost připojení přes CDP s odlišným rizikovým profilem než přístup na stránky, OAuth nebo uživatelem dodané skripty.

To není obvinění. Široké oprávnění je často jediný poctivý způsob, jak danou funkci vůbec postavit, a úzké oprávnění může jednoduše znamenat, že produkt dělá méně. Pointa je, že ten rozdíl je obrovský, je veřejně vidět a v porovnávacích tabulkách se obvykle vůbec neukáže.

Jak jsem postupoval

Každé rozšíření bylo staženo jako .crx z oficiálního aktualizačního endpointu Googlu — stejné URL, které používá i samotný Chrome — a poté rozbaleno a zparsováno. Žádné rozšíření nebylo instalováno a žádný kód rozšíření nebyl spuštěn. Jde o čtení JSON souboru.

Stahování probíhalo tempem zhruba jeden požadavek každé dvě sekundy. Každý .crx, jeho SHA-256 a extrahovaný manifest.json jsou uložené jako artefakty. Thunderbit prošel stejným skriptem jako ostatních devět, ne žádným bokem, takže jeho řádek je odvozen přesně stejně jako ostatní.

Analýza používá dva typy důkazů a drží je odděleně:

  • Deklarované statické chování: vzory hostitelů a položky content_scripts, včetně matches, run_at a all_frames.
  • Schopnosti dostupné runtime kódu: API uvedená v permissions nebo optional_permissions. Tyto deklarace ukazují, co si kód může vyžádat nebo zavolat, ne to, že to skutečně dělá.

Nedávám žádné pořadí typu „nejmocnější“. debugger, userScripts, široký přístup k hostitelům, OAuth scope, přístup ke schránce i externí messaging představují různé typy dat a vyžadují různé podmínky. Porovnat je lze jen s konkrétním threat modelem, který tento audit založený jen na manifestu neposkytuje.

Velikosti níže jsou rozbalené součty v MiB (2²⁰ bajtů), sečtené z položek ZIPu.

Platí k 2026-07-29. Rozšíření se aktualizují; před citací ověřte znovu.

Co deklaruje deset manifestů

Measured results chart: Declared permission strings

Oficiální reference: Chrome's permission declaration guide.

ExtensionVersionUnpackedFilesPermissionsSite accessReaches file://
Axiom.ai5.1.037.1 MiB2328http://*/* + https://*/*
Table Capture11.0.4121.1 MiB1154 (+3 optional)<all_urls>
Magical3.119.116.8 MiB39513 (+2 optional)<all_urls>
Thunderbit (ours)4.6.415.9 MiB788 recognized (+1 unrecognized array string: commands)<all_urls>
Clay for Chrome1.0.06.3 MiB516*://*/* (injects only on own domain)
Listly0.9.63.5 MiB847http://*/*, https://*/*, file:///*.html
Hexomatic1.8.42.7 MiB372own domains only
Agenty2.9.72.2 MiB494none declared
Clip to Clay1.8.00.7 MiB1642 named domains
TexAu v21.6.60.3 MiB12614 named domains

Ještě dvě položky byly na kandidátním seznamu a v tabulce nejsou, a to z důvodů, které stojí za samostatné zmínění.

Rozptyl je designové rozhodnutí, ne důsledek velikosti

Agenty nedeklaruje žádná host permissions a nenasazuje žádné content scripts. Jeho čtyři oprávnění jsou activeTab, scripting, identity a identity.email. activeTab je to úzké: dává přístup k aktuální kartě až po kliknutí na rozšíření, a to jen do chvíle, než odejdete jinam. Na vašich stránkách se nic nespouští, dokud to sami nevyvoláte. A to vše v 2,2 MiB.

Axiom.ai deklaruje http://*/* a https://*/*, vkládá content scripts odpovídající <all_urls> a rozbalí se na 37,1 MiB ve 232 souborech — sedmnáctkrát víc než Agenty, se stálým přístupem ke každé stránce, kterou navštívíte.

Hexomatic je podobný Agenty: dvě oprávnění (storage, tabs), žádné host permissions, content scripts omezené na jeho vlastní dvě domény.

Clay for Chrome má třetí podobu, kterou je dobré oddělit: jako host permission deklaruje *://*/*, ale content scripts vkládá jen na své vlastní doméně. Trvalá schopnost je široká; automatické chování je úzké. Samotná tabulka oprávnění tyto rozdíly splývá.

Pět z deseti se může dostat k souborům na disku

file:/// není web. Je to váš lokální souborový systém zobrazený v panelu prohlížeče — PDF, které jste otevřeli, HTML export, stažená faktura.

Oficiální reference: Chrome match-pattern documentation.

Tři rozšíření to říkají výslovně. Dvě se k tomu dostanou bez přímého pojmenování: <all_urls> zahrnuje i schéma file:.

ExtensionHow it reaches file://Names file:// in its manifest?Where
Magicalmatches file:///* — every local file Chrome will render, not just HTML — in four of its six content-script entriescontent scripts, and web_accessible_resources
Listlymatches file:///*.htmlcontent scripts
Table Capture<all_urls> content scripts, and it also names the schemeweb_accessible_resources
Axiom.aipurely by virtue of the <all_urls> wildcardnowhere
Thunderbit (ours)purely by virtue of the <all_urls> wildcardnowhere

http://*/* a https://*/* file:// nepokrývají; <all_urls> a *://*/* se v tomto také liší. Pět zde uvedených rozšíření je těch, jejichž deklarace se ke schématu dostanou jednou nebo druhou cestou — ne podle toho, jaký wildcard zvolily.

Chrome to všechno schovává za přepínač „Allow access to file URLs“ na úrovni každého rozšíření, který je ve výchozím stavu vypnutý, takže deklarace je žádost, ne udělení. Pět z deseti je poctivý počet a dvě z těchto pěti nikdy nikde v manifestu file:// nezapíšou: Axiom.ai a naše rozšíření.

Tento součet zahrnuje i web_accessible_resources, nejen content scripts a host permissions. Table Capture tam uvádí file://*/*; bez této sekce by se chybně zařadilo mezi rozšíření, jejichž manifesty se k souborům dostanou, aniž by schéma pojmenovaly.

Oprávnění, která neuvidíte, dokud si je nerozsvítíte

System diagram: Permissions you can't see until they're requested

optional_permissions jsou deklarovaná předem, ale žádají se až za běhu, takže se neobjeví v instalačním promptu. Používají je dvě rozšíření, z nichž jedno je podstatné.

Extensionoptional_permissionsThe one that matters
Table CaptureuserScripts, downloads, identityuserScripts can run user-supplied scripts in page contexts after Chrome's user gate is enabled
Magicaldownloads, webRequestwebRequest observes network traffic

userScripts je do chvíle, než je vyžádáno, neviditelné a pro kohokoli, kdo počítá jen oprávnění, snadno přehlédnutelné.

Má navíc bránu, kterou ostatní oprávnění v tomto auditu nemají, a bez ní bych ho nadhodnotil. Samotné deklarování userScripts nestačí: Chrome vyžaduje předem explicitní akci uživatele. Před Chromem 138 to byl Developer Mode zapnutý globálně na chrome://extensions. Od Chrome 138 je to přepínač Allow User Scripts na stránce detailu daného rozšíření, ve výchozím stavu vypnutý. U běžné instalace je tedy schopnost deklarovaná, ale neaktivní. Přesné tvrzení je podmíněné: Table Capture může zpřístupnit API userScripts až poté, co uživatel zapne příslušnou bránu v Chromu. Tento audit neměřil, jak často uživatelé do nastavení chodí nebo přepínač zapínají.

Ani jedno není skryté; obojí je v manifestu. Tabulka, která ignoruje sekci optional, oba produkty podhodnocuje.

Načasování injektáže, nejen rozsah

Nejen kam se content script vkládá, ale i kdy, výrazně mění obraz. document_start je nejranější hook, který Chrome nabízí; all_frames zasahuje i třetí strany vložené do stránky.

Všechno v této sadě, co staticky injektuje do všech rámců, seřazené podle deklarovaného načasování:

Extensionrun_atall_framesContent-script match pattern
Table Capturedocument_start<all_urls>
Listlydocument_startfile:///*.html plus all of http and https
Axiom.aidocument_startown domains only
Clay for Chromedocument_startown domains only
Thunderbit (ours)document_end<all_urls>
Magicaldocument_idlefile:///* plus broad http and https
TexAudocument_idle (unset)fourteen named patterns

Table Capture a Listly používají nejranější hook na široké sady patternů. Axiom.ai a Clay for Chrome používají stejné načasování, ale jen na svých vlastních doménách — stejná agresivita, úzký cíl.

Pro statické deklarace platí, že <all_urls> plus all_frames je strop šířky záběru, a na něm jsou jak Table Capture, tak Thunderbit. Liší se deklarovaným načasováním: Table Capture používá document_start; statický content script Thunderbit používá document_end. Runtime API jsou samostatná kategorie schopností a z této tabulky je nelze odvodit.

Počet oprávnění je špatná souhrnná statistika. Table Capture deklaruje čtyři oprávnění — méně než většina zde — a přitom injektuje do všech rámců na <all_urls> v document_start, plus userScripts na vyžádání.

Kdo smí rozšíření posílat zprávy

externally_connectable určuje, které weby nebo jiná rozšíření mohou posílat zprávy přímo do background scriptu rozšíření. Jeho výchozí nastavení je neintuitivní.

Vynechání klíče je to benevolentní nastavení. Výchozí chování Chromu, když externally_connectable chybí, je, že se může připojit jakékoli rozšíření, ale žádná webová stránka ne. Deklarace klíče je způsob, jak to omezit.

Při tomto čtení se tabulka obrací:

Extensionexternally_connectable declarationWho can message it
AgentyomittedPermissive default — any extension may connect, no web page may
Clay for ChromeomittedPermissive default — any extension may connect, no web page may
Clip to ClayomittedPermissive default — any extension may connect, no web page may
ListlyomittedPermissive default — any extension may connect, no web page may
Table CaptureomittedPermissive default — any extension may connect, no web page may
TexAuomittedPermissive default — any extension may connect, no web page may
Thunderbit (ours)omittedPermissive default — any extension may connect, no web page may
Hexomaticeight extension IDs and six web originsOpens both channels from a closed baseline
Axiom.aiseven web origins, no idsExtension channel closed, seven web pages opened
Magical{"ids": [], "matches": []}The only extension here that closes both channels explicitly

Pravidlo Chromu má dvě úrovně. Z referenční dokumentace manifestu:

SituationWho may connect
the whole key is absent"all extensions can connect, but no web pages can connect"
key present, ids unset or []"no extensions or apps can connect"
key present, matches unset or []"no web pages can connect"

Benevolentní výchozí stav je spojený s nepřítomností celého klíče. Jakmile klíč existuje, obě podpole začínají zavřená a jejich hodnoty jednotlivé kanály rozšiřují.

Axiom.ai deklaruje klíč jen s matches. Jeho ids je tedy nevyplněné, což znamená, že se mu nemůže připojit žádné rozšíření — kanál pro rozšíření je uzavřený, ne otevřený. Otevřel ale sedm webových původů, z nichž jen jeden patří Axiomu: dva jsou neidentifikovatelné třetí strany (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) a zbytek je localhost, 0.0.0.0, host Google APIs a jedna velká sociální platforma, kterou neprovozuje.

Hexomatic otevírá kanál pro rozšíření osmi jmenovaným ID. S klíčem přítomným je výchozí stav nula rozšíření; osm zadaných ID ho rozšíří na osm. Jeho šest matches rozšiřuje druhý kanál z ničeho, přičemž dvě z nich jsou http://localhost:8000/* a http://localhost:3000/* přes obyčejné HTTP — cokoli odpovídá na těchto portech na uživatelově stroji, je v allowlistu.

Sedm z deseti klíč vynechává úplně, včetně našeho, a právě těch sedm je na benevolentním výchozím nastavení pro messaging mezi rozšířeními. Dvě rozšíření tento kanál uzavírají: Magical explicitně pomocí ids: [] a Axiom.ai tím, že klíč deklaruje, ale ids vůbec neuvede. Magical je jediné, které explicitně uzavírá oba kanály.

A právě to je důvod číst manifesty, ne jen sčítat oprávnění. Stejné rozšíření může být na jedné ose široké a na jiné nejpřísnější v celé sadě.

Osa, kterou nikdo nepočítá: OAuth scopes

Manifest může obsahovat blok oauth2 a scope uvnitř jsou přístupem k vašim účtům u jiných firem — jiný typ dosahu než cokoli výše a něco, co žádný součet oprávnění nepostihne.

Oficiální reference: Google OAuth 2.0 scope list.

Extensionoauth2 scopes requested
Axiom.aiopenid, email, profile, auth/drive, auth/spreadsheets
Table Captureauth/spreadsheets, auth/userinfo.email
Agentyopenid, email, profile
The other seven, including oursnone declared

https://www.googleapis.com/auth/drive je ten široký scope. Google nabízí užší drive.file, který dává přístup jen k souborům, které aplikace sama vytvořila nebo které si uživatel výslovně vybere; auth/drive znamená čtení, úpravy, vytváření i mazání napříč celým Drive uživatele. auth/spreadsheets má stejný charakter pro všechny tabulky, ke kterým může účet přistupovat. Axiom.ai i Table Capture tedy spojují scope pro Google účet s přístupem na stránky přes <all_urls>.

Dvě omezení toho, co tato tabulka dokazuje. Scope je požadovaný, ne udělený — Google zobrazí consent screen a uživatel může odmítnout, a rozšíření API možná nikdy vůbec nezavolá. A manifest vidí OAuth jen přes Chrome identity flow; rozšíření, které vás místo toho pošle na webovou přihlašovací stránku, zde nemusí deklarovat nic. Sedm nul znamená „v tomto souboru nepožadováno“, ne „žádný přístup k vašemu Google účtu“ — včetně našeho, a právě proto je tato osa uváděna jako samostatná, ne jako tvrzení o úzkosti.

Naše vlastní rozšíření na stejné škále

Thunderbit 4.6.4 prošel stejným parserem manifestu jako ostatních devět. Balíček má po rozbalení 15,9 MiB ve 78 souborech.

Deklarované statické chování: <all_urls> se objevuje v host permissions i v matches content scriptů. Statický skript běží v all_frames na document_end. Protože <all_urls> zahrnuje i file:, může manifest po zapnutí chromího přepínače přístupu k souborům dosáhnout i na lokální soubory. Thunderbit také vynechává externally_connectable, takže Chrome ve výchozím stavu povoluje zprávy od jakéhokoli rozšíření, ale ne od žádné webové stránky.

Runtime capability ceiling: pole permissions obsahuje devět řetězců: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups a tabs. Chrome z nich jako oprávnění rozpoznává osm; commands je klíč na úrovni manifestu a jako položka v tomto poli nemá žádný efekt. Thunderbit je v této sadě jediné rozšíření, které deklaruje debugger, což umožňuje připojení CDP k tabu. Manifest také zpřístupňuje scripting pro runtime registraci. Tato API vytvářejí schopnosti nad rámec statického řádku document_end, ale samotné čtení manifestu nemůže prokázat, že Thunderbit volá konkrétní CDP metodu nebo registruje skript v nějakém dřívějším okamžiku.

Tohle rozlišení blokuje několik lákavých, ale neplatných srovnání. To, že chybí užší oprávnění cookies, nijak neomezuje, co může kód s debugger získat. To, že chybí clipboardRead, není důkazem, že přístup ke schránce není možný. Naopak přítomnost debugger není důkazem, že tyto cesty skutečně používá. Odpověď na kteroukoli z těchto otázek vyžaduje kontrolu zdrojového kódu nebo runtime tracing, a ani jedno zde provedeno nebylo.

V tomto nástroji je Thunderbit široký v přístupu na statické stránky, v této sadě jedinečný tím, že deklaruje debugger, a zároveň je na výchozím chování Chromu pro messaging mezi rozšířeními. Neexistuje jediné „nejsilnější“ pořadí, protože audit nedává společný threat model pro CDP, OAuth, userScripts, schránku a přístup k hostitelům.

Střídmý design, který nikdo neprodává

TexAu má 0,3 MiB — je zde nejmenší zhruba na polovinu — a místo wildcardu jmenuje čtrnáct konkrétních webů: sociální sítě, vývojářskou platformu, publikační platformy, chat produkt, poskytovatele business dat a vlastní doménu. Jeho content scripts odpovídají přesně těm samým čtrnácti.

Z tohoto manifestu lze vyčíst přesně, kde je rozšíření aktivní. Zároveň jde i o produktové sdělení — seznam cílových webů říká, k čemu je nástroj určen, jasněji než marketing.

Kompromis je reálný: seznam domén nemůže pokrýt web, který na něm není, a pro každý nový cíl je potřeba vydat novou verzi. Ale „čtrnáct pojmenovaných domén“ a „každé URL, které existuje“ jsou dvě velmi odlišné věci, a jen jedna z nich je čitelná.

Dva produkty, které nebyly tím, za co se vydávaly v seznamu

Rozšíření Captain Data není veřejně distribuované. Aktualizační endpoint Googlu vrací pro jeho extension ID HTTP 204 s prázdným tělem — odpověď pro něco, co Store anonymně neservíruje. Naopak jeho listing stránka byla dostupná anonymně — HTTP 200, 509 829 bajtů. Co v ní ale zachycení nenašlo, byl číslo verze, datum poslední aktualizace ani počet instalací; vlastní poznámky skriptu uvádějí, že nula zde je slabý důkaz, a nebyla pozorována žádná přihlašovací bariéra. ID je reálné a první strany, takže nejpravděpodobnější je distribuce přes odkaz nebo neveřejný listing, ale nedokázal jsem rozlišit to od delistování a nebudu hádat.

Dataflow Kit nemá vůbec žádné Chrome rozšíření. Jeho web popisuje hostovanou webovou aplikaci s výběrem klikáním a REST API. Přesto byl na seznam Chrome-rozšíření zařazen — což je přesně způsob, jakým tyto seznamy obvykle vznikají.

Zastaralost a dosah, protože obojí jde snadno ověřit

Metadata ze Store přidávají ke konfiguraci produktů kontext nad rámec oprávnění. Stejné údaje byly zachyceny pro každé rozšíření dne 2026-07-30.

ExtensionStore versionLast updatedInstall bucket
Thunderbit (ours)4.6.4July 28, 2026200,000
Listly0.9.6July 25, 2026100,000
Axiom.ai5.1.0July 20, 2026100,000
Table Capture11.0.41June 26, 2026200,000
Magical3.119.1April 4, 2026200,000
Agenty2.9.7February 8, 202610,000
TexAu1.6.6August 20, 20257,000
Clay for Chrome1.0.0April 9, 202510,000
Clip to Clay1.8.0April 8, 20251,000
Hexomatic1.8.4September 6, 20243,000
Captain Datanot publicly served

Tři produkty nevydaly novou verzi už přes rok a Hexomatic téměř dva roky. U rozšíření je to důležitější než u knihoven: Chrome vydává stabilní verzi zhruba každé čtyři týdny a samotná platforma rozšíření se pod tím mezitím mění. userScripts ve Chromu 138 změnilo svou uživatelskou bránu; rozšíření, které naposledy vyšlo v roce 2024, bylo napsané proti jinému souboru pravidel, než jaký dnes prohlížeč vynucuje.

Dvě věci, které tato tabulka není. Počty instalací jsou Googlem zaokrouhlené do bucketů — 1 000 / 3 000 / 7 000 / 10 000 / 100 000 / 200 000 — takže porovnávají jen řády velikosti, nic jemnějšího, a několik produktů uvádí ve vlastním marketingu vyšší čísla. Nedávné datum je fakt o vydání, ne verdikt o kvalitě údržby nebo riziku oprávnění.

Jeden užitečný vedlejší výsledek: verze v obchodu odpovídá verzi manifestu u všech deseti analyzovaných balíčků. CRX soubory, které tento audit parsoval, jsou ty, které Store dnes skutečně servíruje, nikoli zastaralé kopie.

Čerstvost ovlivňuje, kolik následné práce si výběr zaslouží; nemění sémantiku manifestu. Rozšíření s pojmenovanými doménami, které bylo aktualizováno před rokem, může pořád vystavovat menší plochu než wildcardové rozšíření vydané včera. Novější balíček může být přesto lepší provozní volba, pokud rychle reaguje na změny v Chromu. Pro shortlist použijte datum ve Store k rozhodnutí, co znovu otestovat, a manifest k rozhodnutí, co vyžaduje podrobnější kontrolu schopností. Nedělejte z těch dvou sloupců jedno skóre.

Co vám manifest neřekne

Deklarované oprávnění je strop, ne chování. <all_urls> znamená, že rozšíření může číst každou stránku. Neznamená, že to dělá, ani že cokoli odchází z vašeho počítače. Zjištění toho, co se skutečně děje, vyžaduje sledování síťového provozu za běhu — jinou práci, kterou jsme zde neprováděli, a nic výše by nemělo být čteno jako důkaz zneužití.

Související čtení: Chrome extension testability experiment.

Ještě tři hranice:

  • Chrome řadu věcí aktivně omezuje. Přístup k souborům je ve výchozím stavu vypnutý; activeTab je záměrně úzké; volitelná oprávnění vyžadují runtime prompt; uživatelé vidí při instalaci seznam oprávnění.
  • Široká oprávnění jsou často nezbytná. Nástroj, jehož úkolem je „vytáhnout tabulku z libovolné stránky, na které právě jste“, nemůže fungovat jen z allowlistu pojmenovaných domén. Úzký rozsah je někdy disciplína a někdy jen menší produkt.
  • Jedna verze, jeden den. Každý údaj pochází z balíčku servírovaného 2026-07-29.

Materiální opravy v analýze

Zveřejněné počty používají tři pravidla, která se při rychlém parseru manifestu snadno pletou. Za prvé, <all_urls> zahrnuje schéma file:, ale Chrome skutečný přístup k souborům drží za přepínačem ovládaným uživatelem. Za druhé, web_accessible_resources.matches je třeba číst společně s content scripts a host permissions; právě tam Table Capture výslovně uvádí file://*/*. Za třetí, externally_connectable má různé výchozí hodnoty podle toho, zda celý klíč chybí, nebo zda klíč existuje s prázdným podpoletem. Tabulky výše tato pravidla používají konzistentně.

Součet oprávnění Thunderbitu navíc rozlišuje mezi syrovými řetězci a skutečně rozpoznanými oprávněními Chromu. Jeho pole má devět položek, ale commands patří na nejvyšší úroveň manifestu, takže efektivní součet použitý zde je osm rozpoznaných oprávnění plus jeden nerozpoznaný řetězec. A konečně: statické deklarace content_scripts nejsou důkazem, že kód volá scripting.registerContentScripts nebo nějakou CDP metodu. Tyto možnosti se objevují jen u runtime capability, nikdy jako pozorované chování. Raw manifesty, CRX hash a výstup parseru jsou auditní stopou pro tyto normalizace, takže čtenář nemusí věřit textu jen na slovo.

Pro skutečné rozhodnutí o instalaci porovnávejte alespoň čtyři dimenze odděleně: které stránky jsou ve výchozím stavu v rozsahu, jaká explicitní akce uživatele zpřístupní víc, která browserová nebo účtová API se stanou dostupnými a kteří externí volající mohou rozšíření posílat zprávy. Model activeTab u Agenty, řízený userScripts u Table Capture, Drive scope u Axiom.ai a deklarace debugger u Thunderbit nejsou body na jedné přímce. Jsou to různé odpovědi na různé bezpečnostní otázky.

Tady je toto srovnání aplikované na čtyři záměrně odlišné návrhy:

ExtensionPage scope visible in the manifestAdditional gateNon-page capability in this auditExternal caller posture
Agentyno host permission or static content scriptuser invokes activeTab on the current tabChrome identity permissionskey omitted: any extension may connect, no web page may
Table Capturestatic scripts on <all_urls> in all frames at document_startfile access is off by default; userScripts needs Chrome's separate user gateoptional userScripts, downloads, and identitykey omitted: any extension may connect, no web page may
Axiom.aiHTTP and HTTPS wildcard access; static scripts at document_start on its own domainsOAuth consent for requested Google scopesDrive and Sheets OAuth scopes declaredextension callers closed; seven web origins opened
Thunderbit<all_urls> host access and static scripts in all frames at document_endfile access is off by default; attaching debugger has Chrome-controlled user-visible behaviordebugger, scripting, tabs, and related browser APIs declaredkey omitted: any extension may connect, no web page may

Ani tato tabulka nedává vítěze. Úzký trvalý přístup Agenty na stránku nic neříká o tom, co jeho backend dělá s odeslanými daty. Účtové scope Axiom.ai nelze srovnávat s tím, že rozšíření čte právě otevřenou stránku. Deklarace userScripts u Table Capture je inertní, dokud uživatel nezapne samostatnou bránu. debugger u Thunderbitu vystavuje širokou plochu pro řízení prohlížeče, ale manifest neprozrazuje, na které CDP domény nebo metody jeho kód sahá. Každý řádek říká, co si máte ověřit dál: runtime síťový provoz, zdrojový kód, consent flow nebo stopy browser API.

System diagram: How to read your own

Stejné oddělení je důležité i při čtení instalačního promptu Chromu. Hrubý počet oprávnění neukáže načasování, dosah do rámců, OAuth scope, web_accessible_resources ani vynechaný klíč externally_connectable. Naopak široká deklarace není důkazem sběru nebo exfiltrace. Užitek z auditu manifestu je prioritizovaný plán runtime testů: identifikujte datovou plochu, zaznamenejte uživatelskou bránu a pak sledujte, zda se deklarovaná cesta skutečně používá.

Jak číst vlastní manifest

Související čtení: browser automation guide.

  1. chrome://extensionsDetails zobrazuje udělený přístup ke stránkám a umožňuje přepnout ho na on click u všeho, co nepotřebuje trvalý přístup. Tím zúžíte stránkový přístup z toho, co je výše. Netýká se to ale příchozího messagingu (externally_connectable míří na service worker bez ohledu na to) ani oprávnění na úrovni prohlížeče. Thunderbitova deklarace debugger je zde důležitá. Bezpečnostní dokumentace Chromia k rozšířením říká, že debugger API „may in some cases also sidestep other typical restrictions, such as host permissions or file access“, takže nastavení přístupu k webu na „on click“ neomezuje, k čemu může sáhnout. Tohle ovládání se navíc netýká tabs, webNavigation, clipboardRead, downloads ani čehokoli v optional_permissions.
  2. Pro samotný soubor platí, že balíček leží v adresáři Chrome Extensions/<id>/<version>/. Čtěte šest polí: permissions, optional_permissions, host_permissions, content_scripts (tedy matches, run_at a all_frames uvnitř), externally_connectable — s tím, že nepřítomný klíč je pro extension callers benevolentní — a web_accessible_resources, jejichž matches mohou pojmenovat schémata, která content scripts nikdy nepokrývají. Thunderbitovo poslední pole obsahuje dvě položky <all_urls>, které zpřístupňují index.html a dva přibalené skripty každému originu, s use_dynamic_url: false, což umožňuje stránce zjistit, zda se tyto stabilní extension URL resolvují.
  3. Zkontrolujte datum poslední aktualizace v listingu vůči aktuální verzi Chromu.

Zveřejnění a zdroje: tento článek vydává Thunderbit, jehož rozšíření je zahrnuto ve stejné tabulce i parseru. Náš open-source scraper pillar pokrývá ne-rozšířené nástroje.

Vyzkoušet Thunderbit pro extrakci webových dat

Stručná verze

Deset rozšíření pro scraping a automatizaci, včetně našeho, bylo přečteno přímo z jejich vlastních manifestů.

Agenty neuvádí žádný přístup ke stránkám ani žádné content scripts, funguje jen na kartě, na kterou kliknete, a má 2,2 MiB. Axiom.ai deklaruje každou HTTP a HTTPS URL napříč 37,1 MiB. Magical deklaruje třináct oprávnění včetně clipboardRead — a zároveň je to jediné rozšíření zde, které zcela uzavírá příchozí messaging. Table Capture deklaruje jen čtyři oprávnění a injektuje se v document_start do všech rámců na <all_urls> — tedy na stejný rozsah stránek jako my, jen dříve — plus userScripts na vyžádání. TexAu je nejmenší a jmenuje nejvíc cílů — čtrnáct vzorů přes třináct různých vlastností. Není ale jediné, které je jmenuje: Clip to Clay deklaruje dvě (clay.com a jeden third-party web) a Hexomatic i Clay for Chrome jmenují své vlastní domény. TexAu je jediné, jehož pojmenovaný seznam tvoří převážně domény jiných lidí. Pět z deseti může dosáhnout na soubory na vašem disku, přičemž dvě z nich — Axiom.ai a my — nikdy nikde file:// ani nenapíšou.

Thunderbit, tedy naše rozšíření, stojí na širším konci: <all_urls> pro host access i statickou injektáž, plus debugger, které žádné jiné rozšíření v této sadě nedeklaruje. Zároveň je na výchozím nastavení Chromu, které povoluje zprávy od jakéhokoli rozšíření, a po zapnutí chromí brány pro přístup k souborům dosáhne i na file://.

Deklarace je strop, ne chování, a nic z toho neukazuje zneužití. Je to ale veřejné, zdarma ověřitelné a rozdíl mezi oběma konci je větší než cokoli na produktových stránkách.

Vyzkoušet Thunderbit pro extrakci webových dat Get Started Free

Časté dotazy

Znamená široké oprávnění, že rozšíření dělá něco špatně — a proč nestačí počítat oprávnění? Ne. A počet nestačí, protože míjí dvě věci. <all_urls> znamená, že rozšíření smí číst každou stránku, kterou navštívíte; neříká nic o tom, co skutečně dělá nebo zda něco odchází z vašeho počítače. Nástroj postavený na extrakci dat z libovolné stránky zkrátka nemůže fungovat z allowlistu pojmenovaných domén. Zjištění je v rozptylu, ne v pochybení — skutečné chování by vyžadovalo runtime analýzu provozu, kterou tento audit neprováděl. A co se týče počtu: nastavení injektáže nejsou oprávnění, takže Table Capture deklaruje čtyři, a přitom injektuje v document_start, do all_frames, na <all_urls>. A optional_permissions se vůbec neobjeví v instalačním promptu — Table Capture si může za běhu vyžádat userScripts, což dovoluje spouštět libovolné uživatelské skripty v kontextu stránky, a Magical může požádat o webRequest.

Které z nich chce nejméně? Agenty: čtyři oprávnění, žádná host permissions, žádné content scripts. Spoléhá na activeTab, které dává přístup k aktuální kartě jen po kliknutí na rozšíření a jen do chvíle, než odejdete jinam. Hned za ním je Hexomatic, se dvěma oprávněními a content scripts omezenými na jeho vlastní domény.

Jak může rozšíření dosáhnout na moje lokální soubory, aniž by deklarovalo file://? Protože <all_urls> zahrnuje schéma file:. Listly, Magical a Table Capture file:// pojmenovávají přímo — Magical v content scripts a Table Capture v web_accessible_resources. Axiom.ai a Thunderbit se k němu dostanou přes wildcard, aniž by ho někde napsaly. http://*/* a https://*/* file:// nepokrývají. Chrome drží přístup k souborům ve výchozím stavu vypnutý za přepínačem na úrovni rozšíření, takže deklarace je žádost, ne povolení.

Co je externally_connectable a proč je jeho vynechání benevolentní volba? Určuje webové originy nebo ID rozšíření, které mohou posílat zprávy do background scriptu rozšíření. Výchozí chování Chromu, když klíč chybí, je, že se může připojit jakékoli rozšíření a žádná webová stránka ne. Sedm z těchto deseti ho vynechává, včetně Thunderbit. S klíčem přítomným Hexomatic otevírá kanál pro rozšíření osmi jmenovaným ID; Axiom.ai otevírá sedm webových originů a kanál pro rozšíření nechává uzavřený; Magical deklaruje prázdné seznamy pro oba kanály a oba uzavírá.

Co deklaruje vlastní manifest Thunderbitu? <all_urls> pro host access a statickou injektáž content scriptů, v all_frames na document_end; 15,9 MiB ve 78 souborech; a devět řetězců v poli oprávnění. Osm z nich je rozpoznaných jako oprávnění: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups a tabs. commands je klíč na nejvyšší úrovni manifestu a v tomto poli nemá žádný efekt. Žádné jiné rozšíření v této sadě debugger nedeklaruje. Thunderbit se také dostane k file:// přes <all_urls> po zapnutí chromí brány pro přístup k souborům a vynechává externally_connectable. Runtime chování nebylo spuštěno, takže audit netvrdí, která CDP nebo scripting API rozšíření skutečně volá.

Ke
Ke
CTO ve Thunderbit | Senior Data Scientist a expert na ML S téměř desetiletou zkušeností v oblasti strojového učení a datové vědy je Ke Shen absolventem Kolumbijské univerzity a bývalým Senior Data Scientist ve Walmart Labs. Díky hlubokým odborným znalostem v Pythonu, R, Javě a statistice, uznávaným i mezi kolegy, sdílí ověřené poznatky o tom, jak převést složité AI algoritmy od teorie až k produkční architektuře.
Topics
Web Scraping ToolsAI Web Scraper
Obsah
Thunderbit · AI agent pro webová data

Extrahuj data z libovolné stránky za 1 kliknutí

Důvěřuje mu více než 250 000 uživatelů
k dispozici bezplatný plán
Z webové stránky do tabulky
Popiš, co potřebuješ — AI agent Thunderbit to nasbírá a exportuje do Excelu, Google Sheets, Airtable nebo Notion. Začni zdarma.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week