Sıfır Site Erişimi mi, Yoksa Tüm URL’ler mi: On Scraper Uzantısı Arasındaki İzin Dağılımı

Son güncelleme: August 19, 2026
Sıfır Site Erişimi mi, Yoksa Tüm URL’ler mi: On Scraper Uzantısı Arasındaki İzin Dağılımı
AI Özeti
Her Chrome uzantısı, istenen API’ler, host kalıpları, statik content script’ler, isteğe bağlı izinler ve izin verilen harici bağlantılar gibi tarayıcı düzeyindeki yetki sınırının önemli bir bölümünü tanımlayan bir manifest.json dosyasıyla gelir. Bu, yüklediğiniz paketin içindeki herkese açık bir dosyadır. Ancak çalışma anındaki kodun beyan edilen yetkilerden hangilerini kullandığını, makineden neyin çıktığını ya da hangi hesap erişiminin ayrı bir web girişi üzerinden gerçekleştiğini kanıtlamaz. Bu denetim için seçtiğim on tarama ve tarayıcı otomasyonu uzantısını, bizim olan Thunderbit dahil, inceledim. Dağılım oldukça geniş.

Her Chrome uzantısı, manifest.json adlı bir dosyayla birlikte gelir ve bu dosya, uzantının tarayıcı seviyesindeki yeteneklerinin önemli bir bölümünü tanımlar: istenen API’ler, ana makine desenleri, statik içerik betikleri, isteğe bağlı izinler ve izin verilen harici bağlantılar. Bu dosya, yüklediğiniz paketin içinde herkese açık olarak bulunur. Ancak hangi beyan edilen yeteneklerin çalışma zamanında gerçekten kullanıldığını, makineden hangi verilerin çıktığını ya da hangi hesap erişiminin ayrı bir web oturumu üzerinden gerçekleştiğini kanıtlamaz.

Bu denetim için seçilen on tarayıcı otomasyonu ve veri çekme uzantısının manifestlerini inceledim; bunların arasında bizim olan Thunderbit de vardı. Sonuçlar oldukça çeşitli. Birinde kalıcı site erişimi hiç yok. Bir başkasında clipboardRead dahil on üç izin var. Bu sette debugger iznini beyan eden tek uzantı Thunderbit; bu, sayfa erişimi, OAuth veya kullanıcının sağladığı betiklerden farklı bir risk profiline sahip geniş bir CDP bağlanma yeteneği.

Bunların hiçbiri bir suçlama değil. Geniş bir izin, çoğu zaman belirli bir özelliği oluşturmanın dürüst tek yoludur; dar bir izin de ürünün daha az şey yaptığı anlamına gelebilir. Buradaki esas nokta, bu farkın çok büyük olduğu, herkese açık biçimde yayımlandığı ve karşılaştırma tablolarına hiç girmediğidir.

Bu çalışma nasıl yapıldı

Her uzantı, Google’ın kendi güncelleme uç noktasından — Chrome’un da kullandığı aynı URL’den — .crx olarak indirildi, ardından açılıp ayrıştırıldı. Hiçbir uzantı kurulmadı ve hiçbir uzantı kodu çalıştırılmadı. Bu çalışma, bir JSON dosyasının okunmasından ibarettir.

İndirmeler yaklaşık her iki saniyede bir istek olacak şekilde hızlandırıldı. Her .crx dosyası, SHA-256 özeti ve çıkarılan manifest.json birer artefakt olarak saklandı. Thunderbit de diğer dokuz uzantı gibi aynı betikten geçti; ayrı bir kanaldan işlenmedi. Dolayısıyla satırı, onlarınkiyle tam olarak aynı yöntemle türetildi.

Analiz iki tür kanıt kullanır ve bunları birbirinden ayrı tutar:

  • Beyan edilen statik davranış: matches, run_at ve all_frames dahil olmak üzere host desenleri ve content_scripts girdileri.
  • Çalışma zamanı kodunun kullanabileceği yetenek: permissions veya optional_permissions içindeki API adları. Bu beyanlar, kodun ne isteyebileceğini veya çağırabileceğini gösterir; gerçekten bunu yaptığını değil.

"En güçlü" gibi bir sıralama verilmedi. debugger, userScripts, geniş host erişimi, OAuth kapsamları, pano erişimi ve harici mesajlaşma farklı verileri açığa çıkarır ve farklı önkoşullar gerektirir. Bunları karşılaştırmak için bu sadece-manifest denetiminin sunmadığı bir tehdit modeli gerekir.

Aşağıdaki boyutlar, açılmış paket boyutlarıdır ve ZIP girdilerinden toplanan MiB (2²⁰ bayt) cinsindendir.

2026-07-29 itibarıyla. Uzantılar güncellenir; alıntı yapmadan önce yeniden kontrol edin.

On manifest ne beyan ediyor

Measured results chart: Declared permission strings

Resmî referans: Chrome’un izin beyanı kılavuzu.

UzantıSürümAçılmış boyutDosya sayısıİzinlerSite erişimifile:// erişimi var mı
Axiom.ai5.1.037.1 MiB2328http://*/* + https://*/*
Table Capture11.0.4121.1 MiB1154 (+3 isteğe bağlı)<all_urls>
Magical3.119.116.8 MiB39513 (+2 isteğe bağlı)<all_urls>
Thunderbit (bizim)4.6.415.9 MiB788 tanınan (+1 tanınmayan dizi dizesi: commands)<all_urls>
Clay for Chrome1.0.06.3 MiB516*://*/* (yalnızca kendi alanında enjekte eder)
Listly0.9.63.5 MiB847http://*/*, https://*/*, file:///*.html
Hexomatic1.8.42.7 MiB372yalnızca kendi alan adları
Agenty2.9.72.2 MiB494beyan edilen yok
Clip to Clay1.8.00.7 MiB1642 adlandırılmış alan adı
TexAu v21.6.60.3 MiB12614 adlandırılmış alan adı

İki uzantı daha aday listesindeydi ve tabloda yok; bunun ayrı ayrı raporlanması gereken nedenleri var.

Aradaki fark boyutla değil, tasarımla ilgili

Agenty hiçbir host izni beyan etmiyor ve hiç içerik betiği göndermiyor. Dört izni activeTab, scripting, identity ve identity.email. Buradaki dar olan activeTab: uzantıya yalnızca ona tıkladıktan sonra, sadece geçerli sekmede ve yalnızca siz başka bir sayfaya gidene kadar erişim verir. Siz tetiklemeden sayfalarınızda hiçbir şey çalışmaz. Boyutu 2.2 MiB.

Axiom.ai http://*/* ve https://*/* beyan ediyor, <all_urls> ile eşleşen içerik betikleri enjekte ediyor ve 232 dosyada 37.1 MiB’ye açılıyor — Agenty’den on yedi kat büyük, üstelik ziyaret ettiğiniz her sayfaya kalıcı erişimi var.

Hexomatic, Agenty’ye benziyor: iki izin (storage, tabs), host izni yok, içerik betikleri yalnızca kendi iki alan adıyla sınırlı.

Clay for Chrome ise ayrıştırılması gereken üçüncü bir yapı: bir host izni olarak *://*/* beyan ediyor ama içerik betiklerini yalnızca kendi alanında enjekte ediyor. Kalıcı yetenek geniş; otomatik davranış dar. Sadece izin tablosu bunları birbirine karıştırır.

On uzantının beşi diskinizdeki dosyalara erişebiliyor

file:/// bir web sitesi değildir. Bu, tarayıcı sekmesinde görüntülenen yerel dosya sisteminizdir — açtığınız bir PDF, dışa aktardığınız bir HTML, indirdiğiniz bir fatura.

Resmî referans: Chrome eşleşme deseni belgeleri.

Üç uzantı bunu açıkça söyler. İkisi ise bunu adını vermeden yapar: <all_urls> şemasına file: dahildir.

Uzantıfile:// erişimi nasıl sağlıyorManifestinde file:// adı geçiyor mu?Nerede
Magicalaltı içerik betiği girdisinin dördünde, Chrome’un işleyeceği her yerel dosyayla — yalnızca HTML ile değil — eşleşen file:///*içerik betikleri ve web_accessible_resources
Listlyfile:///*.html ile eşleşiriçerik betikleri
Table Capture<all_urls> içerik betikleri ve ayrıca şemayı adlandırırweb_accessible_resources
Axiom.aiyalnızca <all_urls> joker karakteri sayesindehiçbir yerde
Thunderbit (bizim)yalnızca <all_urls> joker karakteri sayesindehiçbir yerde

http://*/* ve https://*/* file:// kapsamına girmez; <all_urls> ve *://*/* da bu konuda farklıdır. Buradaki beş uzantı, şemaya bir yoldan ya da başka bir yoldan ulaşanlardır — hangi joker biçimini seçtiklerinin sonucu değil.

Chrome bunu, her uzantı için ayrı olan ve varsayılan olarak kapalı bulunan “Dosya URL’lerine erişime izin ver” anahtarının arkasına koyar; bu yüzden beyan bir izin değil, bir taleptir. Beş üzerinden beşin dürüst sayısı budur ve bu beşin ikisi manifestlerinde hiçbir yerde file:// yazmaz: Axiom.ai ve bizimki.

Bu sayım, yalnızca içerik betiklerini ve host izinlerini değil, web_accessible_resources bölümünü de kapsar. Table Capture, orada file://*/* adını verir; bu bloğu atlamak, onu şemayı adlandırmadan dosyalara ulaşan uzantılar arasına yanlışlıkla yerleştirirdi.

Ancak istendiğinde görünen izinler

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

optional_permissions önceden beyan edilir ama çalışma zamanında istenir; bu yüzden kurulum sırasındaki uyarıda görünmezler. İki uzantı bunları kullanıyor ve bunlardan biri önemli.

Uzantıoptional_permissionsÖnemli olan
Table CaptureuserScripts, downloads, identityuserScripts, Chrome’un kullanıcı kapısı etkinleştirildikten sonra sayfa bağlamlarında kullanıcının sağladığı betikleri çalıştırabilir
Magicaldownloads, webRequestwebRequest, ağ trafiğini gözlemler

userScripts, istenene kadar görünmez ve izin sayısını okuyan biri için de görünmezdir.

Ayrıca bu izin, bu denetimdeki diğer izinlerin sahip olmadığı bir kapıya bağlıdır; bunu atlamak, onu olduğundan daha güçlü gösterirdi. userScripts beyan etmek onu kullanmak için yeterli değildir: Chrome açık bir kullanıcı eylemi ister. Chrome 138’den önce bu, chrome://extensions içinde genel olarak açılan Developer Mode idi. Chrome 138’den itibaren ise uzantının kendi ayrıntı sayfasında bulunan, varsayılan olarak kapalı Allow User Scripts anahtarıdır. Yani sıradan bir kurulumda bu yetenek beyan edilmiş olsa da pasiftir. Kesin ifade koşulludur: Kullanıcı Chrome’un kapısını açtıktan sonra Table Capture userScripts API’sini kullanılabilir hale getirebilir. Bu denetim, kullanıcıların bu ayar sayfasına ne sıklıkla gittiğini veya anahtarı açtığını ölçmedi.

İkisi de gizli değil; ikisi de manifestte yer alıyor. İsteğe bağlı bölümü yok sayan bir tablo, iki ürünü olduğundan zayıf gösterir.

Yalnızca kapsam değil, enjeksiyon zamanı da önemli

Bir içerik betiğinin nasıl enjekte edildiği de önemlidir ve tabloya yansımaz. document_start, Chrome’un sunduğu en erken kancadır; all_frames üçüncü taraf gömülü öğelere ulaşır.

Kümede, statik olarak tüm çerçevelere enjekte edenlerin, beyan edilen zaman sırasına göre listesi:

Uzantırun_atall_framesİçerik betiği eşleşme deseni
Table Capturedocument_start<all_urls>
Listlydocument_startfile:///*.html artı http ve https’in tamamı
Axiom.aidocument_startyalnızca kendi alan adları
Clay for Chromedocument_startyalnızca kendi alan adları
Thunderbit (bizim)document_end<all_urls>
Magicaldocument_idlefile:///* artı geniş http ve https
TexAudocument_idle (ayarlanmamış)on dört adlandırılmış desen

Table Capture ve Listly, geniş eşleşme desenleri boyunca en erken kancayı kullanıyor. Axiom.ai ve Clay for Chrome aynı zamanlamayı yalnızca kendi alanlarında kullanıyor — aynı saldırganlık, dar hedef.

Statik beyanlar için <all_urls> + all_frames, eşleşme genişliğinde üst sınırdır ve hem Table Capture hem de Thunderbit oradadır. Ancak beyan edilen zamanları farklıdır: Table Capture document_start kullanır; Thunderbit’in statik içerik betiği document_end kullanır. Çalışma zamanı API’leri ayrı bir yetenek sınıfıdır ve bu tablodan çıkarılamaz.

İzin sayısı kötü bir özet istatistiktir. Table Capture burada çoğundan daha az sayıda, yani dört izin beyan eder; buna rağmen document_start zamanında, tüm çerçevelerde, <all_urls> üzerinde enjekte olur ve ayrıca isteğe bağlı olarak userScripts alabilir.

Uzantıya kim mesaj gönderebilir

externally_connectable, hangi web sayfalarının veya diğer uzantıların bir uzantının arka plan betiğine doğrudan mesaj gönderebileceğini kontrol eder. Varsayılanı sezgiye aykırıdır.

Anahtarın hiç yazılmaması, en izin verici ayardır. Chrome’da externally_connectable yoksa varsayılan olarak her uzantı bağlanabilir, fakat hiçbir web sayfası bağlanamaz. Bunu beyan etmek, erişimi kısıtlamanın yoludur.

Bu okumayla tablo tersine döner:

Uzantıexternally_connectable beyanıKim mesaj gönderebilir
Agentyyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Clay for Chromeyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Clip to Clayyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Listlyyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Table Captureyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
TexAuyokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Thunderbit (bizim)yokİzin verici varsayılan — her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Hexomaticsekiz uzantı kimliği ve altı web kaynağıKapalı bir başlangıç noktasından her iki kanalı da açar
Axiom.aiyedi web kaynağı, ids yokUzantı kanalı kapalı, yedi web sayfası açılmış
Magical{"ids": [], "matches": []}Burada her iki kanalı da açıkça kapatan tek uzantı

Chrome’un kuralının iki seviyesi vardır. Manifest referansından:

DurumKim bağlanabilir
anahtarın tamamı yoksa"all extensions can connect, but no web pages can connect"
anahtar var, ids tanımsız ya da [] ise"no extensions or apps can connect"
anahtar var, matches tanımsız ya da [] ise"no web pages can connect"

İzin verici varsayılan, anahtarın tamamen yokluğuna bağlıdır. Anahtar bir kez var olunca, her iki alt alan da kapalı başlar ve değer yazmak her kanalı genişletir.

Axiom.ai anahtarı yalnızca matches ile beyan ediyor. Bu yüzden ids tanımsızdır; yani hiçbir uzantı ona mesaj gönderemez — uzantı kanalı kapalıdır, açık bırakılmış değil. Açtığı şey yedi web kaynağıdır; bunlardan yalnızca biri Axiom alanıdır: ikisi atfedilemeyen üçüncü taraflar (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*), geri kalanlar ise localhost, 0.0.0.0, bir Google APIs sunucusu ve işlememediği büyük bir sosyal platformdur.

Hexomatic, uzantı kanalını sekiz adlandırılmış kimliğe açıyor. Anahtar mevcut olduğunda başlangıç sıfır uzantıdır; sekizini adlandırmak bunu sekize çıkarır. Altı matches girdisi de diğer kanalı sıfırdan genişletir ve bunların ikisi düz HTTP üzerinden http://localhost:8000/* ve http://localhost:3000/*’dur — kullanıcının makinesinde bu portlarda yanıt veren herhangi bir şey izin listesinin içindedir.

On uzantının yedisi anahtarı tamamen atlıyor; bizimki de bunların arasında, ve bunlar uzantıdan-uzantıya mesajlaşmada izin verici varsayılanda duranlardır. İki uzantı bu kanalı kapatıyor: Magical, ids: [] ile açıkça; Axiom.ai ise anahtarı beyan edip ids’i hiç anmayarak. Her iki kanalı birden kapatan tek uzantı Magical.

Son cümle, manifestleri izin saymaktan ziyade neden okumak gerektiğinin cevabıdır. Aynı uzantı, bir eksende geniş, diğerinde kümedeki en sıkı uzantı olabilir.

Kimsenin saymadığı eksen: OAuth kapsamları

Bir manifest oauth2 bloğu taşıyabilir ve içindeki kapsamlar, başka şirketlerdeki hesaplarınıza erişim demektir — yukarıdakilerden farklı bir erişim türü ve hiçbir izin sayısının yansıtmadığı bir alan.

Resmî referans: Google OAuth 2.0 kapsam listesi.

Uzantıİstenen oauth2 kapsamları
Axiom.aiopenid, email, profile, auth/drive, auth/spreadsheets
Table Captureauth/spreadsheets, auth/userinfo.email
Agentyopenid, email, profile
Diğer yedisi, bizimki dahilbeyan edilen yok

https://www.googleapis.com/auth/drive geniş olandır. Google, yalnızca uygulamanın kendisinin oluşturduğu ya da kullanıcının açıkça seçtiği dosyalara erişim veren daha dar bir drive.file kapsamı sunar; auth/drive ise kullanıcının tüm Drive’ında görme, düzenleme, oluşturma ve silme yetkisi verir. auth/spreadsheets de hesabın erişebildiği tüm e-tablolar için aynı şekilde geniştir. Hem Axiom.ai hem de Table Capture, bir Google hesabı kapsamını <all_urls> sayfa erişimiyle eşleştiriyor.

Bu tablonun neyi kanıtladığına dair iki sınırlama var. Bir kapsam istenir, verilmez — Google bir onay ekranı gösterir ve kullanıcı reddedebilir; uzantı da API’yi hiç çağırmayabilir. Ayrıca manifest, Chrome’un identity akışı üzerinden yapılan OAuth’u görür; bunun yerine sizi bir web giriş sayfasına yönlendiren bir uzantı burada hiçbir şey beyan etmeyebilir. Yedi sıfır, “bu dosyada istenmedi” anlamına gelir; “Google hesabınıza erişim yok” anlamına gelmez — bizimkinde de olduğu gibi. Bu eksenin raporlanma nedeni de budur; dar olduğu iddiası değil.

Kendi uzantımız, aynı ölçekte

Thunderbit 4.6.4, diğer dokuz uzantıyla aynı manifest ayrıştırıcısından geçti. Paket, açılmış hâliyle 78 dosyada 15.9 MiB.

Beyan edilen statik davranış: host_permissions ve içerik betiği eşleşmelerinde <all_urls> yer alır. Statik betik document_end zamanında all_frames içinde çalışır. <all_urls> file: şemasını da içerdiği için, kullanıcı Chrome’un dosya erişim anahtarını açtıktan sonra manifest yerel dosyalara ulaşabilir. Thunderbit ayrıca externally_connectable öğesini atlar; bu da Chrome’un varsayılanına göre her uzantıdan mesaj kabul edildiği, fakat hiçbir web sayfasından kabul edilmediği anlamına gelir.

Çalışma zamanı yetenek tavanı: permissions dizisi dokuz dize içerir: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups ve tabs. Chrome bunların sekizini izin olarak tanır; commands, üst düzey bir manifest anahtarıdır ve bu dizide bir giriş olarak etkisizdir. Thunderbit, sette debugger beyan eden tek uzantıdır ve bu, bir sekmeye CDP bağlayabilir. Manifest ayrıca çalışma zamanında kayıt için scripting yeteneğini kullanılabilir kılar. Bu API’ler, document_end satırının ötesinde yetenekler oluşturur; ancak manifest okuması Thunderbit’in belirli bir CDP metodunu çağırdığını ya da belirli bir daha erken zamanda betik kaydettiğini göstermez.

Bu ayrım, birkaç cazip ama geçersiz karşılaştırmayı engeller. Daha dar bir cookies izninin yokluğu, debugger ile çalışan kodun neye erişebileceğini sınırlandırmaz. clipboardRead yokluğu, pano erişiminin imkânsız olduğunun kanıtı değildir. Tersine, debugger varlığı da bu yolların kullanıldığının kanıtı değildir. Bu soruların herhangi birine yanıt vermek için kaynak kod incelemesi ya da çalışma zamanı izlemesi gerekir; bunların hiçbiri yapılmadı.

Bu araç üzerinde Thunderbit, statik site erişiminde geniştir, bu sette debugger beyan eden tek uzantıdır ve uzantıdan-uzantıya mesajlaşmada Chrome’un varsayılanındadır. CDP, OAuth, userScripts, pano ve host erişimi için ortak bir tehdit modeli sunulmadığından, tek bir “en güçlü” sıralama yoktur.

Kimsenin pazarlamadığı ölçülü tasarım

TexAu 0.3 MiB — buradakilerin en küçüğü, üstelik iki kat farkla — ve joker karakter kullanmak yerine on dört belirli site adı veriyor: sosyal ağlar, bir geliştirici platformu, yayıncılık platformları, bir sohbet ürünü, bir iş verisi sağlayıcısı ve kendi alan adı. İçerik betikleri de tam olarak aynı on dört desenle eşleşiyor.

Bu manifesti okuyup uzantının tam olarak nerede aktif olduğunu anlayabilirsiniz. Bu aynı zamanda bir ürün beyanıdır — hedef listesi, aracın ne için tasarlandığını pazarlama metninden daha açık söyler.

Bedeli de gerçek: adlandırılmış bir liste, üzerinde olmayan bir siteyi tarayamaz ve her yeni hedef için bir sürüm gerekir. Ama “on dört adlandırılmış alan adı” ile “var olan her URL” çok farklı önermelerdir; bunlardan yalnızca biri okunabilir durumdadır.

Liste ne dediyse o olmayan iki ürün

Captain Data’nın uzantısı herkese açık olarak dağıtılmıyor. Google’ın güncelleme uç noktası, uzantı kimliği için HTTP 204 ve boş gövde döndürüyor — mağazanın anonim olarak sunmayacağı bir şeyin yanıtı. Buna karşılık listeleme sayfası anonim olarak sunuldu: HTTP 200, 509.829 bayt. Yakalamada bunun içinde sürüm numarası, son güncelleme tarihi ya da kurulum sayısı bulunamadı; betiğin kendi notlarında, oradaki null değerinin zayıf kanıt olduğu yazıyor ve bir giriş duvarı görülmedi. Kimlik gerçek ve birinci taraf olduğundan, bağlantı-yalnızca ya da listelenmemiş dağıtım en olası okuma; ancak bunu delist edilmeden ayıramadım ve tahmin yürütmeyeceğim.

Dataflow Kit’in hiç Chrome uzantısı yok. Sitesi, nokta-tıklama seçimi ve REST API sunan barındırılan bir web uygulaması anlatıyor. Yine de Chrome uzantısı kısa listesine alınmıştı — bu tür listeler genellikle böyle oluşturulur.

Eskilik ve erişim; ikisi de kontrol etmeye açık olduğu için

Mağaza meta verileri, izinlerin ötesinde ürün seçimi için bağlam sağlar. Aynı alanlar 2026-07-30 tarihinde her uzantı için yakalandı.

UzantıMağaza sürümüSon güncellemeKurulum bandı
Thunderbit (bizim)4.6.428 Temmuz 2026200.000
Listly0.9.625 Temmuz 2026100.000
Axiom.ai5.1.020 Temmuz 2026100.000
Table Capture11.0.4126 Haziran 2026200.000
Magical3.119.14 Nisan 2026200.000
Agenty2.9.78 Şubat 202610.000
TexAu1.6.620 Ağustos 20257.000
Clay for Chrome1.0.09 Nisan 202510.000
Clip to Clay1.8.08 Nisan 20251.000
Hexomatic1.8.46 Eylül 20243.000
Captain Dataherkese açık sunulmuyor

Üç ürün bir yıldan uzun süredir yayınlanmamış; Hexomatic ise neredeyse iki yıldır. Uzantılar için bu, kütüphanelerden daha önemlidir: Chrome yaklaşık dört haftada bir kararlı sürüm çıkarır ve uzantı platformu da bunun altında değişmeye devam eder. userScripts kullanıcı kapısını Chrome 138’de taşıdı; 2024’te son kez yayımlanmış bir uzantı, artık tarayıcının uyguladığı kurallardan farklı bir kurallar setine göre yapılmış olabilir.

Bu tabloyun olmadığı iki şey var. Kurulum sayıları Google tarafından bantlanır — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — bu yüzden yalnızca mertebe karşılaştırması yapar, daha fazlasını değil; ayrıca bazı ürünler kendi pazarlamalarında daha büyük rakamlar iddia eder. Yakın tarih, yayınlama gerçeğidir; bakım kalitesi ya da izin riski hakkında hüküm değildir.

Yararlı bir yan ürün: İncelenen on paketin her birinde mağaza sürümü, manifest sürümüyle eşleşiyor. Bu denetimin ayrıştırdığı CRX dosyaları, mağazanın bugün sundukları; eski kopyalar değil.

Güncellik, bir seçimin ne kadar takip çalışması hak ettiğini değiştirir; manifest semantiğini değiştirmez. Bir yıl önce güncellenmiş, adlandırılmış alan adlarına sahip bir uzantı, dün yayımlanmış joker karakterli bir uzantıdan hâlâ daha dar bir sayfa yüzeyi açabilir. Ancak yeni paket, Chrome değişikliklerini hızlı takip ediyorsa operasyonel olarak yine de daha iyi seçenek olabilir. Bir kısa liste için, mağaza tarihini neyin yeniden test edileceğine karar vermek için kullanın; ardından manifesti, neyin daha yakın bir yetenek incelemesi gerektirdiğine karar vermek için kullanın. İki sütunu tek bir puana dönüştürmeyin.

Manifest size ne söylemez

Beyan edilen izin bir tavan, davranış değildir. <all_urls> bir uzantının her sayfayı okuyabileceği anlamına gelir. Bunu gerçekten yaptığını ya da makineden bir şey çıkıp çıkmadığını göstermez. Gerçekte ne olduğunun kanıtı için çalışma zamanında ağ trafiğini izlemek gerekir — bu farklı bir iştir, burada yapılmadı ve yukarıdakilerin hiçbiri kötüye kullanım kanıtı olarak okunmamalıdır.

İlgili inceleme: Chrome uzantısı test edilebilirlik deneyi.

Üç sınır daha:

  • Chrome bunun çoğunu kapılarla sınırlar. Dosya erişimi varsayılan olarak kapalıdır; activeTab kasıtlı olarak dardır; isteğe bağlı izinler çalışma zamanı istemi gerektirir; kullanıcılar kurulumda bir izin listesi görür.
  • Geniş izinler çoğu zaman gereklidir. İşi “içinde olduğunuz herhangi bir sayfadan tablo çıkarmak” olan bir araç, adlandırılmış alan adı listesiyle çalışamaz. Dar kapsam bazen disiplin, bazen daha küçük üründür.
  • Tek sürüm, tek gün. Tüm sayılar 2026-07-29 tarihinde sunulan paketten alınmıştır.

Analizde yapılan önemli düzeltmeler

Yayımlanan sayımlar, hızlı yazılmış bir manifest ayrıştırıcısında kolayca yanlış yapılabilecek üç kuralı dayana alır. Birincisi, <all_urls> file: şemasını içerir; ancak Chrome gerçek dosya erişimini kullanıcı kontrollü bir anahtarın arkasında tutar. İkincisi, web_accessible_resources.matches, içerik betikleri ve host izinleriyle birlikte incelenmelidir; Table Capture’ın file://*/* adını açıkça verdiği yer burasıdır. Üçüncüsü, externally_connectable, anahtarın tamamının yok olup olmamasına ya da anahtarın boş bir alt alanla mevcut olmasına göre farklı varsayılanlara sahiptir. Yukarıdaki tablolar bu kuralları tutarlı biçimde uygular.

Thunderbit’in izin toplamı da ham dizeleri, Chrome’un tanıdığı izinlerden ayırır. Dizide dokuz giriş vardır; ancak commands, üst düzey bir anahtar olduğundan burada etkili sayı sekiz tanınan izin artı bir tanınmayan dizedir. Son olarak, statik content_scripts beyanları, kodun scripting.registerContentScripts ya da bir CDP metodunu çağırdığının kanıtı değildir. Bu olasılıklar yalnızca çalışma zamanı yeteneği altında yer alır; gözlenen davranış olarak değil. Ham manifestler, CRX özetleri ve ayrıştırıcı çıktısı bu normalizasyonların denetim izi olduğundan, okuyucunun metne koşulsuz güvenmesi gerekmez.

Gerçek bir kurulum kararı için en az dört boyutu ayrı ayrı karşılaştırın: varsayılan olarak hangi sayfaların kapsama girdiği, daha fazla erişimi hangi açık kullanıcı eyleminin açtığı, hangi tarayıcı ya da hesap API’lerinin kullanılabilir olduğu ve hangi dış çağıranların uzantıyla mesajlaşabildiği. Agenty’nin activeTab modeli, Table Capture’ın kapılı userScripts yapısı, Axiom.ai’nin Drive kapsamı ve Thunderbit’in debugger beyanı tek bir doğrusal ölçeğin üzerindeki noktalar değildir. Bunlar, farklı tehdit sorularına verilmiş farklı cevaplar.

İşte bu karşılaştırma, kasıtlı olarak farklı dört tasarıma uygulanmış hâliyle:

UzantıManifestte görünen sayfa kapsamıEk kapıBu denetimdeki sayfa dışı yetenekHarici çağıran durumu
Agentyhost izni veya statik içerik betiği yokkullanıcı geçerli sekmede activeTab kullanırChrome identity izinlerianahtar yok: her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Table Capturedocument_start zamanında, tüm çerçevelerde <all_urls> üzerinde statik betiklerdosya erişimi varsayılan olarak kapalı; userScripts Chrome’un ayrı kullanıcı kapısını gerektiriristeğe bağlı userScripts, downloads ve identityanahtar yok: her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz
Axiom.aiHTTP ve HTTPS joker erişimi; kendi alanlarında document_start zamanında statik betikleristenen Google kapsamları için OAuth onayıbeyan edilen Drive ve Sheets OAuth kapsamlarıuzantı çağıranlar kapalı; yedi web kaynağı açık
Thunderbit<all_urls> host erişimi ve document_end zamanında tüm çerçevelerde statik betiklerdosya erişimi varsayılan olarak kapalı; debugger bağlamak Chrome kontrollü, kullanıcıya görünür davranışa bağlıdebugger, scripting, tabs ve ilgili tarayıcı API’leri beyan edilmişanahtar yok: her uzantı bağlanabilir, hiçbir web sayfası bağlanamaz

Bu tablo hâlâ bir kazanan çıkarmıyor. Agenty’nin dar kalıcı sayfa erişimi, arka ucunun gönderilen verilerle ne yaptığını söylemez. Axiom.ai’nin hesap kapsamları, mevcut sayfayı okuyan bir uzantıyla kıyaslanamaz. Table Capture’ın userScripts beyanı, kullanıcı ayrı kapısını açana kadar etkisizdir. Thunderbit’in debugger izni geniş bir tarayıcı denetim yüzeyi açar; ancak manifest, kodunun hangi CDP alanlarını ya da metodlarını çağırdığını göstermez. Her satır size bir sonraki bakılacak yeri söyler: çalışma zamanı ağ trafiği, kaynak kodu, onay akışı veya tarayıcı API izleri.

System diagram: How to read your own

Aynı ayrım, Chrome’un kurulum istemini okurken de önemlidir. Ham bir izin sayısı; zamanlamayı, çerçeve erişimini, OAuth kapsamını, web_accessible_resources öğesini ya da atlanmış bir externally_connectable anahtarını gösteremez. Tersine, geniş bir beyan, toplama ya da dışarı aktarma kanıtı değildir. Bir manifest denetiminin faydalı çıktısı, önceliklendirilmiş bir çalışma zamanı test planıdır: veri yüzeyini belirleyin, kullanıcı kapısını not edin, sonra beyan edilen yolun gerçekten kullanılıp kullanılmadığını gözlemleyin.

Kendi uzantınızı nasıl okursunuz

İlgili inceleme: tarayıcı otomasyonu rehberi.

  1. chrome://extensionsAyrıntılar, verilen site erişimini gösterir ve kalıcı erişime ihtiyaç duymayan her şey için bunu tıklandığında olacak şekilde değiştirmenize izin verir. Bu, yukarıdaki site erişimi kısmını daraltır. Ancak gelen mesajlaşmaya dokunmaz (externally_connectable, servis çalışanına ne olursa olsun ulaşır) ve tarayıcı seviyesi izinlere de dokunmaz. Thunderbit’in debugger beyanı burada önemlidir. Chromium’un kendi uzantı güvenlik dokümanları, debugger API’sinin "bazı durumlarda host permissions veya file access gibi diğer tipik kısıtları da aşabileceğini" söyler; dolayısıyla site erişimini “tıklandığında”ya almak, neye ulaşabileceğini sınırlamaz. Bu kontrol tabs, webNavigation, clipboardRead, downloads veya optional_permissions içindekilere de dokunmaz.
  2. Ham dosya için paket, Chrome’un Extensions/<id>/<version>/ dizininde bulunur. Altı alanı okuyun: permissions, optional_permissions, host_permissions, content_scripts (içindeki matches, run_at ve all_frames ile birlikte), externally_connectable — burada olmayan bir anahtarın uzantı çağıranlar için izin verici olduğunu unutmayın — ve web_accessible_resources; bunun matches alanı, içerik betiklerinin hiç yapmadığı şemaları adlandırabilir. Thunderbit’in son alanında, index.html ve iki paketlenmiş betiği her kaynağa açan iki <all_urls> girdisi vardır; use_dynamic_url: false olduğu için bir sayfa, bu sabit uzantı URL’lerinin çözümlenip çözümlenmediğini test edebilir.
  3. Listenin son güncelleme tarihini geçerli Chrome sürümüyle karşılaştırın.

Açıklama ve kaynaklar: Bu makale, uzantısı aynı tabloda ve ayrıştırıcıda yer alan Thunderbit tarafından yayımlanmıştır. Bizim açık kaynaklı scraper sütunumuz uzantı dışı araçları kapsar.

Web Veri Çekme için Thunderbit’i Deneyin

Kısa versiyon

Bizimki de dahil olmak üzere on veri çekme ve otomasyon uzantısı, kendi manifestlerinden okunarak incelendi.

Agenty hiçbir site erişimi ve içerik betiği beyan etmiyor, yalnızca tıkladığınızda, baktığınız sekmede ve 2.2 MiB içinde çalışıyor. Axiom.ai her HTTP ve HTTPS URL’sini beyan ediyor ve 37.1 MiB boyunca yayılıyor. Magical, clipboardRead dahil on üç izin beyan ediyor — ve ayrıca burada gelen mesajlaşmayı tamamen kapatan tek uzantı. Table Capture yalnızca dört izin beyan ediyor ve document_start zamanında, tüm çerçevelerde, <all_urls> üzerinde enjekte oluyor — bizim ulaştığımız aynı eşleşme tavanına, ama daha erken; ayrıca isteğe bağlı olarak userScripts alabiliyor. TexAu en küçük olanı ve en çok hedefi adlandıran da o — on üç farklı özellik boyunca on dört desen. Bunları adlandıran tek ürün o değil: Clip to Clay iki hedef (clay.com ve üçüncü taraf bir site) beyan ediyor; Hexomatic ve Clay for Chrome ise kendi alan adlarını adlandırıyor. Ama adlandırılmış listesinin çoğu başkalarının sitelerinden oluşan tek ürün TexAu. On uzantının beşi diskinizdeki dosyalara erişebilir, bunların ikisi — Axiom.ai ve bizimki — bunu asla file:// yazmadan yapıyor.

Bizim Thunderbit, geniş uçta yer alıyor: hem host erişimi hem de statik enjeksiyon için <all_urls>, ayrıca bu sette başka hiçbir uzantının beyan etmediği debugger. Chrome’un her uzantıdan mesaj kabul etmeye izin veren varsayılanında duruyor ve Chrome’un kullanıcı kapısı etkinleştirildikten sonra file:// erişebiliyor.

Bir beyan bir tavan, davranış değildir; bunların hiçbiri kötüye kullanım göstermez. Ama bunlar yayımlanmış veriler, kontrol etmesi ücretsiz ve iki uç arasındaki fark ürün sayfalarındaki her şeyden daha büyük.

Web Veri Çekme için Thunderbit’i Deneyin Get Started Free

SSS

Geniş bir izin, uzantının yanlış bir şey yaptığı anlamına gelir mi — ve neden yalnızca izin saymak yeterli değil? Hayır; çünkü sayım iki şeyi kaçırır. <all_urls>, bir uzantının ziyaret ettiğiniz her sayfayı okuyabileceği anlamına gelir; ne yaptığına ya da bir şeyin makinenizden çıkıp çıkmadığına dair hiçbir şey söylemez ve herhangi bir sayfadan veri çıkarmak için yapılmış bir araç, gerçekten de adlandırılmış alan adı listesiyle çalışamaz. Buradaki bulgu, suistimal değil, genişliktir — gerçek davranışı belirlemek için çalışma zamanı trafiği analizi gerekir; bu denetim bunu yapmadı. Sayım tarafına gelince: enjeksiyon ayarları izin değildir, bu yüzden Table Capture dört izin beyan ederken document_start zamanında, all_frames içine, <all_urls> ile eşleşecek şekilde enjekte olur. Ayrıca optional_permissions kurulum isteminde hiç görünmez — Table Capture, çalışma zamanında userScripts isteyebilir; bu da sayfa bağlamlarında rastgele kullanıcı betikleri çalıştırmayı sağlar; Magical ise webRequest isteyebilir.

Bunlardan hangisi en azını istiyor? Agenty: dört izin, host izni yok, içerik betiği yok. activeTab’e dayanır; bu da yalnızca uzantıya tıkladıktan sonra ve siz başka bir yere gidene kadar geçerli sekmeye erişim verir. İkinci sırada Hexomatic var; iki izin ve yalnızca kendi alan adlarıyla sınırlı içerik betikleri.

Bir uzantı, file:// beyan etmeden yerel dosyalarıma nasıl ulaşabilir? Çünkü <all_urls>, file: şemasını içerir. Listly, Magical ve Table Capture file:// desenini açıkça adlandırır — Magical içerik betiklerinde, Table Capture ise web_accessible_resources içinde. Axiom.ai ve Thunderbit, bunu hiçbir yerde yazmadan joker karakter üzerinden erişir. http://*/* ve https://*/*, file:// kapsamına girmez. Chrome, dosya erişimini uzantı başına ayrı bir anahtarın arkasında varsayılan olarak kapalı tutar; bu yüzden beyan bir izin değil, bir taleptir.

externally_connectable nedir ve neden atlanması izin verici seçenektir? Bir uzantının arka plan betiğine hangi web kaynaklarının veya uzantı kimliklerinin mesaj gönderebileceğini adlandırır. Anahtar yokken Chrome’un varsayılanı, her uzantının bağlanabilmesi, ama hiçbir web sayfasının bağlanamamasıdır. Bu on uzantının yedisi, Thunderbit dahil, bunu atlıyor. Anahtar varken Hexomatic, uzantı kanalını sekiz adlandırılmış kimliğe açıyor; Axiom.ai, yedi web kaynağını açarken uzantı kanalını kapalı bırakıyor; Magical ise her iki kanal için de boş listeler beyan ederek ikisini de kapatıyor.

Thunderbit’in kendi manifesti ne beyan ediyor? Host erişimi ve statik içerik betiği enjeksiyonu için <all_urls>, all_frames içinde document_end zamanında; 78 dosya boyunca 15.9 MiB; ve izin dizisinde dokuz dize. Bunların sekizi tanınan izinler: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups ve tabs. commands, üst düzey bir manifest anahtarıdır ve bu dizide etkisi yoktur. Bu sette başka hiçbir uzantı debugger beyan etmiyor. Thunderbit ayrıca Chrome’un dosya erişim kapısı açıldıktan sonra <all_urls> üzerinden file:// erişebilir ve externally_connectable öğesini atlar. Çalışma zamanı davranışı çalıştırılmadı; bu yüzden denetim, uzantının hangi CDP ya da scripting metodlarını gerçekten çağırdığını iddia etmiyor.

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
Topics
Web Scraping ToolsAI Web Scraper
İçindekiler
Thunderbit · AI web veri ajanı

Herhangi bir sayfadan 1 tık içinde veri çıkar

250.000+ kullanıcı tarafından güveniliyor
ücretsiz plan mevcut
Web sayfasından tabloya
İhtiyacını anlat — Thunderbit’in AI Ajanı bunu çeker ve Excel, Google Sheets, Airtable veya Notion’a aktarır. Başlamak ücretsiz.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week