Вы перешли по ссылке на статью, а вместо неё увидели заглушку: «Обнаружен блокировщик рекламы. Отключите его, чтобы продолжить». Возможно, обвинение справедливо. А возможно, никакого блокировщика у вас нет, но сайт всё равно стоит на своём. В любом случае список ваших расширений сайт не видел — и всё-таки вас поймал.
API, который выдавал бы странице список ваших расширений, не существует. Поэтому антиадблок-скрипты ищут не блокировщик. Они подбрасывают на страницу то, что блокировщик обязан удалить, а затем проверяют, что уцелело. Виджет на этой странице прямо сейчас прогоняет шесть таких ловушек против вашего браузера; остальная часть статьи объясняет, что делает каждая из них.
Экономика проста: реклама оплачивает страницу, заблокированная реклама не приносит ничего, а заглушка, которая превращает часть блокирующих посетителей обратно в показы, стоит того, чтобы позлить всех остальных. Ровно поэтому описанные ниже скрипты и существуют.
Элемент-приманка: попался на том, чего нет
Почти каждый блокировщик рекламы поставляется с одним и тем же ядром правил — EasyList, поддерживаемым сообществом каталогом того, как выглядит реклама на странице. Помимо десятков тысяч URL-шаблонов в нём есть косметические правила: скрывать любой элемент с классами вроде ad-unit или adsbox.
Каталог этот публичный, так что антиадблок-скрипты тоже его читают. Старейший трюк детекта — создать невидимый div высотой в один пиксель, надеть на него ровно эти классы и считать его offsetHeight. Браузер без блокировки сообщит этот пиксель. Браузер с блокировкой сообщит ноль, потому что косметический фильтр выставил div в display: none. Страница не видела вашего расширения. Она видела, как div перестал существовать.
<div class="adsbox ad-unit banner_ad"> offsetHeight: 0 Это та самая проверка «CSS-приманка» из виджета выше — и это же движок внутри старых библиотек BlockAdBlock и FuckAdBlock, который половина туториалов «как обнаружить адблок» в интернете переупаковывает до сих пор. Тот же обходной манёвр совершают антибот-системы, когда охотятся на автоматизацию браузера: Puppeteer тоже никто не видит — видят только то, что Puppeteer меняет.
Запросы, которые так и не вернулись
Второе семейство ловушек работает на сетевом уровне. Блокировщики не только прячут элементы — они отказываются загружать что-либо с известных рекламных серверов, поэтому страница отправляет подсадных уток: скрипт с pagead2.googlesyndication.com, картинку с tpc.googlesyndication.com, fetch() к ads.pubmatic.com. Настоящая рекламная инфраструктура, запрошенная намеренно. Если вместо события загрузки срабатывает обработчик ошибки, значит, что-то на вашей машине убило запрос. Консоль Chrome даже называет виновника: net::ERR_BLOCKED_BY_CLIENT.
Четыре из шести проверок виджета устроены именно так — по одной на каждый тип запроса, потому что правила фильтров по-разному относятся к скриптам, картинкам, фоновым изображениям из CSS и fetch-запросам, и блокировщик может попасться на одном, пройдя другой.
Многие издатели обходятся вовсе без подсадных уток. Собственный рекламный скрипт Google, adsbygoogle.js, при загрузке определяет JavaScript-объект, и странице достаточно проверить, существует ли он. Когда настоящий рекламный скрипт сам себе приманка, заблокировать его и выдать себя — одно и то же событие.
Как YouTube распознаёт блокировщик рекламы (и почему это другая история)
YouTube не возится с div-приманками. Его плеер знает, какую рекламу сервер прикрепил к потоку, ожидает срабатывания собственных событий воспроизведения и несёт логику детекта прямо в JavaScript плеера — обфусцированную и перетасовываемую достаточно часто, чтобы авторам фильтр-листов приходилось её постоянно догонять. Google также экспериментировал со вставкой рекламы на стороне сервера — вшиванием роликов прямо в видеопоток, куда не дотянется ни один фильтр-лист. Это другая весовая категория по сравнению со скопированным скриптом-приманкой, и она подкреплена политикой: позиция Google состоит в том, что блокировщики рекламы нарушают условия использования YouTube. Гонка вооружений там идёт быстро и заточена под одну платформу — именно поэтому у вопроса «как YouTube распознаёт адблок» нет стабильного ответа. У механики приманок с этой страницы он есть, и именно на ней держатся остальные девяносто девять процентов заглушек «пожалуйста, отключите блокировщик рекламы».
Обвинили, хотя блокировщика нет
Начните вводить в Google «adblock detected» — и одной из верхних подсказок будет «adblock detected but no adblock». Ловушки объясняют эту путаницу: они срабатывают на блокировку, где бы та ни жила.
- DNS-фильтрация. Pi-hole, NextDNS или роутер с фильтрацией рекламы убивают подсадной запрос ещё до того, как он покинет вашу сеть. Для приманки это выглядит ровно как uBlock Origin.
- Браузеры, блокирующие по умолчанию. Shields в Brave отбрасывает рекламные запросы из коробки, а строгая защита от отслеживания в Firefox блокирует известные рекламные и трекинговые домены. Никаких расширений не требуется.
- Другие расширения. Удалители cookie-баннеров и инструменты приватности прячут элементы и блокируют запросы по собственным причинам — и те же ловушки захлопываются уже за ними.
- Защитное ПО. Антивирусные пакеты с «веб-защитой» фильтруют рекламные домены для всей машины разом.
Детектор не способен определить, какой именно слой съел его приманку, а заглушке это и неважно. Если это ваш случай, виджет выше поставит диагноз: он называет, какие из шести проверок сработали. Проверка элемента указывает на что-то, скрывающее содержимое страницы; проверки запросов — на что-то на сетевом пути.
Как помешать сайтам обнаруживать ваш блокировщик рекламы
У вас три честных варианта и одна грубая пара.
- Внести сайт в белый список блокировщика. Тот самый исход, ради которого заглушка и существует, — механизм, который Adblock Plus институционализировал в виде включённой по умолчанию программы Acceptable Ads.
- Держать фильтр-листы свежими. Та же экосистема, что блокирует рекламу, блокирует и антиадблок: EasyList ведёт отдельный Adblock Warning Removal List, а uBlock Origin поставляет списки Annoyances, которые срезают многие заглушки ещё до того, как вы их увидите.
- Платить сайтам, которые вы действительно читаете. Разом заканчивает противостояние.
- Режим чтения или отключённый JavaScript. Та самая грубая пара: оба убивают детектор вместе со всем остальным, что заставляет страницу работать.
Блокировать рекламу легально — и сайт с тем же правом может отказывать вам в доступе, пока вы не перестанете. Верховный суд Германии подтвердил это ещё в 2018 году, когда издатели судились с создателями Adblock Plus и проиграли. Раз с точки зрения закона всё ясно по обе стороны, остаётся только гонка вооружений.
Ваш блокировщик становится частью отпечатка
Для нашего сравнения пяти популярных блокировщиков рекламы мы прогнали эти же шесть проверок против каждого из них, и разброс оказался широким: Adblock Plus попался на пяти из шести, uBlock Origin — на двух, Ghostery — всего на одной.
| Блокировщик рекламы | Библиотека | CSS-приманка | Скрипт | Картинка | CSS-фон | Fetch | попался на |
|---|---|---|---|---|---|---|---|
| Ghostery | ✓ | ✓ | ✓ | ✕ | ✓ | ✓ | 1/6 |
| uBlock Origin | ✓ | ✓ | ✓ | ✕ | ✓ | ✕ | 2/6 |
| uBlock Lite | ✓ | ✓ | ✓ | ✕ | ✓ | ✕ | 2/6 |
| AdBlock | ✓ | ✓ | ✕ | ✕ | ✓ | ✕ | 3/6 |
| Adblock Plus | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | 5/6 |
Отсюда два вывода. Во-первых, блокировщики не одинаково громкие, и «обнаружимость» — характеристика, по которой их можно выбирать. Во-вторых, сам паттерн — это информация. Какие ловушки сработают, зависит от того, какой у вас блокировщик и какие фильтр-листы, так что результат отправляется в профиль, который строит трекер, вместе с вашим отпечатком шрифтов и canvas-хешем. Блокировщик рекламы не делает вас невидимым. Он делает вас человеком, который блокирует рекламу одним конкретным, измеримым способом.
Что делать на практике
- Посмотрите, что срабатывает. Запустите виджет на этой странице, а затем полное сканирование браузера — для всего смежного: хешей отпечатков, WebRTC и прочего. Знать, на каких проверках вы попадаетесь, — это разница между гаданием и исправлением.
- Обвинили напрасно? Найдите слой. Отключите расширения и перезагрузите страницу. Если детект остался, блокировка сидит глубже: DNS-фильтрация, настройки браузера по умолчанию или веб-защита антивируса. Белый список в расширении, которого у вас нет, никогда не починит блокировку, которую выполняет ваш роутер.
- Работаете с несколькими аккаунтами? Следите за паттерном. Паттерн блокировки — ещё одна черта, которая должна оставаться согласованной внутри каждой личности, сессия за сессией. Incogniton держит каждый профиль полностью отдельным браузером со своими расширениями и настройками, так что привычки блокировки профиля A никогда не просачиваются в отпечаток профиля B.
В следующий раз, когда сайт будет клясться, что у вас работает блокировщик рекламы, вы будете знать, что он поймал на самом деле: div, лишившийся высоты, или подсадной запрос, который так и не вернулся. Виджет выше подскажет, что именно вас выдало.