Надежное обнаружение спам-ботов на базе PhantomJS

Есть ли способ последовательно обнаруживать PhantomJS / CasperJS? Я имел дело с плюсом вредоносных спам-ботов, построенных с ним, и смог в основном блокировать их на основе определенных типов поведения, но мне любопытно, есть ли способ узнать, использует ли CasperJS, как иметь дело с постоянная адаптация становится немного раздражающей.

Я не верю в использование Captchas. Это отрицательный пользовательский интерфейс, и ReCaptcha никогда не работал, чтобы блокировать спам в моих установках MediaWiki. Поскольку у нашего сайта нет пользовательских регистраций (анонимная доска объявлений), нам нужно иметь запись Captcha для каждой записи. Мы получаем несколько тысяч легитимных сообщений в день, а Captcha увидит это число в виде дайв-бомбы.

Я очень разделяю ваше мнение о CAPTCHA. Я перечислил, что я смог обнаружить до сих пор, для моего собственного сценария обнаружения, с аналогичными целями. Это только частично, так как у них гораздо больше безголовых браузеров .

Достаточно безопасно использовать открытые свойства windows для обнаружения / принятия этих конкретных браузеров без головы:

window._phantom (or window.callPhantom) //phantomjs window.__phantomas //PhantomJS-based web perf metrics + monitoring tool window.Buffer //nodejs window.emit //couchjs window.spawn //rhino 

Вышеприведенное из jslint doc и тестирования с фантомными js.

Драйверы автоматизации браузера (используемые браузером или другими службами веб-захвата для моментального снимка):

 window.webdriver //selenium window.domAutomation (or window.domAutomationController) //chromium based automation driver 

Свойства не всегда отображаются, и я изучаю другие более надежные способы обнаружения таких ботов, которые я, вероятно, выйду из сценария с полной версией, когда это будет сделано. Но это в основном отвечает на ваш вопрос.

Вот еще один довольно здравый метод для более удобного обнаружения JS-совместимых браузеров:

 if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser } 

Это должно работать хорошо, потому что по умолчанию свойства равны 0 , даже если размер виртуального видового экрана задается безгласными браузерами, и по умолчанию он не может сообщить размер windows браузера , которого не существует. В частности, Phantom JS не поддерживает внешний или внешний .

ADDENDUM: Однако есть ошибка Chrome / Blink с внешними / внутренними размерами. Хром не сообщает эти размеры, когда страница загружается на скрытую вкладку , например, при восстановлении с предыдущего сеанса. У Safari, похоже, нет этой проблемы. ,

Обновление. Оказывается, у iOS Safari 8+ есть ошибка с внешней шириной и внешнимHeight в 0, и веб-просмотр Sailfish тоже может. Таким образом, хотя это сигнал, его нельзя использовать в одиночку, не помня об этих ошибках. Следовательно, предупреждение : Пожалуйста, не используйте этот необработанный fragment, если вы действительно не знаете, что делаете.

PS: Если вы знаете о других свойствах браузера без браузера, которые не указаны здесь, просьба поделиться комментариями.

Существует не рок-твердый путь: PhantomJS и Selenium – это просто программное обеспечение, используемое для управления программным обеспечением браузера, а не для пользователя, контролирующего его.

С PhantomJS 1.x, в частности, я считаю, что есть некоторый JavaScript, который можно использовать для сбоя браузера, который использует ошибку в используемой версии WebKit (это эквивалентно Chrome 13, поэтому очень мало реальных пользователей должны быть затронуты) , (Я помню, как это упоминалось в списке рассылки Phantom несколько месяцев назад, но я не знаю, был ли описан конкретный JS для использования.) В более общем плане вы могли бы использовать комбинацию пользовательского агента, сочетающуюся с обнаружением функции. Например, если браузер утверждает, что он «Chrome 23», но не имеет функции, которой обладает Chrome 23 (и что у Chrome 13 не было), тогда получите подозрение.

Как пользователь, я ненавижу CAPTCHA тоже. Но они довольно эффективны в том, что они увеличивают стоимость спамера: он должен писать больше программного обеспечения или нанимать людей, чтобы читать их. (Вот почему я думаю, что легкие CAPTCHA являются достаточно хорошими: те, которые раздражают пользователей, – это те, в которых вы не представляете, что он говорит, и им необходимо продолжать перезагрузку, чтобы получить то, что вы узнаете.)

Один из подходов (который, как я полагаю, использует Google), заключается в том, чтобы показать CAPTCHA условно. Например, пользователи, которые вошли в систему, никогда не отображаются. Пользователи, которые уже сделали одну запись в этом сеансе, больше не показываются. Пользователи с IP-адресов в белом списке (которые могут быть созданы из предыдущих легитимных сообщений) не отображаются. Или, наоборот, просто покажите их пользователям из черного списка диапазонов IP.

Я знаю, что ни один из этих подходов не является совершенным, извините.

Вы можете обнаружить фантом на стороне клиента, установив свойство window.callPhantom . Минимальный скрипт находится на стороне клиента:

 var isPhantom = !!window.callPhantom; 

Вот суть с доказательством концепции, что это работает.

Спамер может попытаться удалить это свойство с помощью page.evaluate а затем это зависит от того, кто быстрее. После того, как вы попробовали обнаружение, вы делаете перезагрузку с помощью формы сообщения и CAPTCHA или нет в зависимости от вашего результата обнаружения.

Проблема в том, что вы несете redirect, которое может раздражать ваших пользователей. Это будет необходимо с каждой технологией обнаружения на клиенте. Который может быть искажен и изменен с помощью onResourceRequested .

Как правило, я не думаю, что это возможно, потому что вы можете только обнаружить на клиенте и отправить результат на сервер. Добавление CAPTCHA в сочетании с этапом обнаружения только при загрузке одной страницы не добавляет ничего, поскольку его можно было бы удалить так же легко с помощью phantomjs / casperjs. Защита, основанная на пользовательском агенте, также не имеет смысла, поскольку ее можно легко изменить в phantomjs / casperjs.

Давайте будем гением компьютера.