Proof of concept · adblock filter-list fingerprinting
A VPN hides your IP address. Your adblocker doesn't. Country-specific filter lists — EasyList Germany, Liste FR and others — each block a different set of ad domains. This page probes those domains in your browser, works out which lists you have enabled, and infers your country or language from that alone, even behind a VPN.
2001:1c00:2193:800:1489:8258:bb82:db5e — this is what your IP says. The detection below checks what your adblocker says.
Each list below blocks ad domains specific to one country. We probe 30 domains per list — ones no other list blocks.
Every country list blocks ad domains specific to its region. EasyList Germany, for one,
blocks adnx.de, adition.de and hundreds of other German ad
networks that the base EasyList never touches. We diffed each country list against that
base list (54,000+ domains) and kept only the domains unique to the country.
The page loads a tiny resource — a favicon — from 30 of those domains. If your adblocker blocks one, the request fails in under 30ms, because it never reaches the network. A real network failure (DNS timeout, refused connection) takes over 100ms. That gap is what separates a blocked domain from one that is merely unreachable.
Block 20 or more of a list's 30 domains and that list is almost certainly on. The lists you run, taken together, form a fingerprint — often specific enough to place you in a country or language group, VPN or not.
performance.now() high-resolution timing.Turn on a country-specific list in your adblocker, then re-run the detection and watch it get picked up. Steps for the common setups are below.
brave://settings/shields/filters in your address barhttp://pi.hole/adminpihole -g to update gravity, then re-run detectionNote: DNS-level blocking may not trigger the same timing signature as browser-based adblockers. Results may differ.