How Sites Detect Your Browser Extensions
Most people think of browser extensions as things they added for themselves. An ad blocker, a password manager, maybe a screenshot tool. Private, local, nobody else’s business.
Mostly true, except for one detail that surprises people the first time they see it demonstrated: a website can often work out which extensions you have installed. Without asking, without a permission prompt, and without the extension doing anything wrong.
I run real proxy and cloud phone farms and I test how these browsers handle identification. This is defensive and third person throughout: how the technique works and how it’s defended against, not a recipe against any particular site. No undetectable promises either. This is one more signal, and the useful outcome is understanding it rather than pretending it can be switched off.
Method one: probing reachable files
Many extensions ship files a web page is allowed to load. Images, stylesheets, small scripts, whatever the extension injects into pages it works on. Those files live at addresses beginning with a special scheme followed by the extension’s identifier, a long fixed string that’s identical for everyone who installed it from the store.
So a page simply tries to load one. If it loads, the extension is installed. If it fails, it isn’t. No permission, no interaction, a few milliseconds per check. Run that against a few hundred popular identifiers and you have a fairly complete inventory.
Browsers have pushed back, and the pushback is worth understanding because it’s partial rather than total. The main defence was to stop those files being loadable by default, so an extension must explicitly declare which files the web can reach. That helped a lot. But plenty of extensions still need to declare some, because that’s how they function, and any file that remains reachable is still a probe. Some browsers went further and randomise the identifier per installation, so the address differs for every user. That genuinely breaks the simple inventory check, and it’s the better fix, but it isn’t universal across browsers or extensions.
Method two: observing what the extension does
This one doesn’t probe anything. It watches what happens to the page.
An extension that modifies pages leaves evidence in the page. An ad blocker removes or hides elements, or prevents requests completing. A password manager injects an icon into login fields. A coupon tool adds a button at checkout. A dark mode extension rewrites colours.
A page can inspect itself. It can plant a decoy element that looks exactly like an advert, with the class names and dimensions ad blockers key on, then check a moment later whether it still exists and is still visible. If it vanished, something removed it. It can check whether elements it created are still the colours it set. It can watch for nodes it never created appearing inside its own form fields.
None of that is exotic. It’s a page reading its own contents, which every page can do.
There’s a quietly clever variation. Instead of planting one decoy, a page plants a spread of them, each matching a different filter list, and sees which survive. Ad blockers don’t all block the same things; they subscribe to different lists, and those lists differ by region and preference. The pattern of which decoys vanished isn’t just evidence that you block ads, it’s a rough fingerprint of which blocking setup you run and sometimes which regional list you subscribe to. Considerably more specific than a yes or no.
Method three: timing
Blocking a request isn’t free. An extension that intercepts and cancels requests changes how long things take, consistently.
A page can request a handful of resources, some on well known block lists and some not, and compare how long each takes to fail or succeed. The shape of that timing profile says a lot about whether something is filtering, and often which filter list it uses.
Why any of this identifies a person
One common extension tells a site almost nothing. A very large share of users run an ad blocker, so learning you have one narrows almost nothing.
The identifying power is in combination and rarity. Think of it as a set: an ad blocker, a specific password manager, a particular translation tool, a niche developer utility, and something regional that only exists in one language. Individually unremarkable. Together, that exact five item set might belong to a genuinely small number of people.
And unlike many fingerprinting signals, this one is remarkably stable. People don’t change extensions often. The set persists across sessions, profile clears and ip changes, which makes it a durable link rather than a momentary observation.
The two profile-level failure modes
The empty profile. A fresh automated profile typically carries no extensions at all. That sounds like the safest state, and in a population sense it’s unusual. Real people accumulate things. A browser clearly used for a while, by a person, with a history, tends to have picked up one or two. A profile that’s perfectly bare, every time, across many accounts, is its own pattern.
The shared set. Someone sets up profiles for a lot of accounts and installs the same three extensions in every one, because they’re useful for the work. Now every account carries an identical, slightly unusual extension fingerprint. Individually each profile looks fine. Collectively they’re wearing a uniform. Same failure as every other layer of this subject: the values weren’t wrong, the sharing was.
Contradictions worth knowing
Mobile. Extensions are rare on phones. Most mobile browsers either don’t support them or support a small curated handful, and the overwhelming majority of phone users run none. A profile claiming to be a phone through the user agent, screen dimensions and touch capability, then exhibiting the unmistakable behaviour of a desktop ad blocker, has produced a contradiction needing no clever analysis. It says phone, then does something phones essentially never do.
Enterprise. Some environments push a fixed set of managed extensions to every machine, and that set is distinctive. A profile carrying a corporate security extension alongside a personal password manager and a consumer coupon tool describes a machine belonging to two worlds. Plausible occasionally, not fifty times across supposedly unrelated accounts.
Versions leak. Injected scripts are often recognisable, and their specifics change between releases. The observable behaviour narrows not just to which extension you have but sometimes to roughly which version, which makes the set finer grained than most people assume.
And it correlates. A regional extension that only exists in one country, on a profile whose network says elsewhere and whose language says a third place, is three signals disagreeing rather than one odd extension.
Defence, and its honest limits
Start with the uncomfortable part. This is one of the harder signals to neutralise, because the evidence isn’t a value the browser reports. It’s the observable consequence of software actually doing something to the page. You can’t spoof your way out of an element having been removed. It was removed, and the page can see that.
What good tooling can do is control the surface:
- Keep the extension set deliberate rather than accidental.
- Keep it plausible for the profile’s supposed type of user.
- Do not clone an identical set across every profile, because that turns a weak signal into a strong link.
Browser level defences help with the first mechanism: randomised extension identifiers break the direct probe, and browsers supporting that are meaningfully better here. Some extensions can be configured to be less visibly interventionist, though the tradeoff is obvious, because an ad blocker that doesn’t block isn’t an ad blocker.
The practical framing: decide what the profile is supposed to be, and let the extensions match that story. A profile representing an ordinary person can carry ordinary things, and probably should. A profile that needs to be maximally quiet should carry as little as possible, and accept that carrying nothing is itself slightly unusual. What you want to avoid is the middle, where a bare automated profile sprouts a distinctive set of tools no ordinary user of that description would have, and then wears that same set across fifty accounts.
As always, test rather than assume. The probe check and the decoy check both run against your own profile in about a minute, and they’ll tell you what a site would learn.
I test these browsers on real multi account setups, and the reviews cover what each tool actually exposes rather than what the marketing page claims. They’re all here.
Get new guides and videos first — join the Telegram channel.