Статьи

Разблокировка Adblock

Если вы используете Firefox с установленным расширением Adblock Plus … Заметили ли вы что-то другое на sitepoint.com?

Пару недель назад я реализовал скрипт для всего сайта, который разблокирует рекламу, заблокированную Adblock Plus .

Видите ли, некоторое время назад, когда весь Firefox был заблокирован , разгорелся разгром , я сделал несколько заявлений о том, как легко обойти программное обеспечение для блокировки рекламы (хотя, конечно, я бы не сказал, как). Затем, спустя некоторое время (не совсем уверенный, когда… я, вероятно, был пьян), я проиграл пари и должен был доказать это. Ставки были высоки, и я чувствовал себя немного грязным, но я человек своего слова, поэтому я должен был это сделать. И как это случилось, это превратилось в увлекательную и интересную задачу, с соответствующим моментом, чтобы сделать

Рекламировать или не рекламировать

Я сам не фанат рекламы, и у меня действительно нет проблем с людьми, использующими программное обеспечение для блокировки рекламы. Я знаю, что есть люди, которые думают, что блокировка рекламы равносильна краже, но я думаю, что их аргументы совершенно неубедительны. Любая часть Интернета настраивается для вас — вы можете сделать сайты с высококонтрастной цветовой схемой, потому что вам нужно это прочитать, или вы можете отфильтровать все изображения, потому что у вас нет пропускной способности для их загрузки, или вы можете выборочно удаляйте определенные типы контента, потому что вы просто не хотите его видеть. Это все то же самое, и возражение против одного — это возражение против всех из них (вот почему закон никогда не сможет вмешаться — из-за того, что деятельность по блокировке рекламы станет незаконной, все модификации пользователей станут незаконными, включая использование вспомогательных технологий. пользовательский CSS и пользовательские скрипты и другие расширения).

В любом случае проблема заключается не в блокировке рекламы, а в бизнес-моделях, которые отказываются признавать человеческую природу, и поставщиках контента, которые хотят зарабатывать деньги, притворяясь, что это не их мотив. Ипохризия этого довольно оскорбительна, на мой взгляд — если ваш контент бесплатный, сделайте его бесплатным; если это не бесплатно, то взимайте плату за это. Но не делайте это поверхностно свободным, а затем попытайтесь заставить меня чувствовать себя виноватым, когда это вам чего-то стоит.

Тем не мение

Это мое мнение, но как бы то ни было, я люблю бросать странного кота среди голубей! Так что я в любом случае реализовал сценарий разблокировки, просто чтобы подлить бензин в дебаты и напомнить всем, кто забыл о простой правде: контроль контента — и управление цифровыми правами в целом — гонка вооружений, и никто никогда не победит .

вот как это работает

Для начала нам нужно убедиться, что Adblock действительно запущен — мы не хотим запускать скрипт, если он не запущен, или мы в итоге дублируем все наши объявления. Раньше была ошибка Firefox, которая выставляла информацию об установленных расширениях, но это давно исправлено. Так:

if(navigator.userAgent.toLowerCase().indexOf('firefox') == -1) { return; }

var self = this, tester = document.createElement('img');
document.getElementsByTagName('body').item(0).appendChild(tester);
tester.setAttribute('src', '/ads/draino.gif');
window.setTimeout(function()
{
	if(!tester || tester.style.display == 'none')
	{
		//adblock is running
	}
}, 10);

Здесь мы предполагаем, что фильтры Adblock будут соответствовать URI, содержащему / ads , потому что если это произойдет, мы никогда не сможем загрузить это изображение, и мы знаем, что Adblock работает. Одна из умных вещей в Adblock заключается в том, что он вообще ничего не удаляет из документа — он никогда не позволяет им добраться до документа. Adblock подключается к API-интерфейсу политики содержимого Firefox, который контролирует допустимый контент на уровне HTTP- запросов, что означает, что заблокированный контент никогда даже не запрашивается . (Пустой исходный элемент также не отображается с динамически генерируемой пользовательской таблицей стилей, которую нельзя переопределить никакими стилями в документе, поскольку пользовательские таблицы стилей всегда имеют приоритет).

Конечно, если тестовое изображение не заблокировано, то остальная часть сценария не запустится, но, учитывая очевидность целевого URI , вполне вероятно, что он будет работать.

Как только мы установим, что Adblock запущен, мы можем начать искать блокируемый контент. Сценарий определяет подмножество фильтров URI (аналогично самому Adblock, но ограничивается объявлениями, которые, как мы знаем, мы показываем), и список элементов для проверки (сценарии, изображения и встроенные кадры). Каждый экземпляр целевого элемента проверяется на соответствие фильтрам, чтобы определить, не заблокирован ли он, и если это так, мы запомним его адрес.

Теперь у нас есть список адресов, мы должны иметь возможность запрашивать эти данные вручную, что мы можем сделать, вызвав PHP- скрипт через XMLHttpRequest Однако это не так просто, потому что Adblock влияет даже на запросы XHR. Мы должны предотвратить блокировку наших запросов, поэтому для этого мы кодируем адреса, чтобы фильтры не принимали их. Это не должно быть причудливым, так что кодировки Rot13 вполне достаточно, и в итоге мы сделаем такие запросы:

 request.open('GET', 'draino.php?encuri=uggc://jjj.zlfvgr.pbz/nqf/cebzb.wf', true);

Сценарий PHP декодирует этот URI, а затем захватывает его содержимое с помощью fopen()PHP проверен для предотвращения атак с использованием инъекций и запрещает запросы, Заходите с указанных хостов). В зависимости от того, что выдает рекламный код, мы можем получить в ответ данные JavaScript, HTML или изображения.

Если это HTML, то это потому, что исходное объявление было <iframe>SRCPHP , и все готово:

 <iframe src="draino.php?encuri=uggc://jjj.zlfvgr.pbz/nqf/cebzb.wf">

Если это данные изображения, мы его кодируем с помощью base64, чтобы на стороне клиента мы могли использовать данные для создания нового изображения с URI данных , который не имеет внешнего ресурса и поэтому не блокируется:

 var img = document.createElement('img');
img.setAttribute('src', 'data:image/gif;base64,' + request.responseText);
element.parentNode.insertBefore(img, element);

element

Наконец, если ответ — JavaScript, нам нужно проанализировать и оценить этот код. Каждое объявление будет отличаться, поэтому нам в основном нужны разные случаи для каждого провайдера. Например, если провайдер возвратил HTML, заключенный в оператор document.writeinnerHTML

 var code = eval(request.responseText.replace('document.write', ''));
var span = document.createElement('span');
span.innerHTML = code;
element.parentNode.insertBefore(span, element);

И вот как мы катимся!

Adblock вращается вокруг фильтрации URI , поэтому, если мы сможем обмануть его, позволив нам запрашивать запрещенные данные, мы можем просто добавить эти данные прямо на страницу, и тогда Adblock больше не с чем работать. Мы даже не искажаем нашу рекламную статистику, потому что исходное объявление никогда не запрашивалось в первую очередь — наш единственный запрос, который проходит!

Единственное, что мы не можем обработать, это скрипт, который генерирует <iframe> Теоретически мы могли бы углубиться и рекурсивно разблокировать содержимое страницы iframe … но это становится немного нелепым.

Блокировка разблокировщика

Да, хорошо, я никогда не хотел быть злым ( если ты начнешь идти по темному пути, он навсегда будет доминировать в твоей судьбе ) Если вы хотите, чтобы все это не работало, вам просто нужно заблокировать сценарий разблокировки — просто добавьте draino в ваш список фильтров. И вообще, я собираюсь удалить это на следующей неделе, это было просто немного забавы;)

Если только я не сделал этот сценарий неблокируемым …