Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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 и тестирование с помощью phantom js.

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

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

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

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

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

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

ДОБАВЛЕНИЕ: Однако есть ошибка Chrome/Blink с внешними/внутренними ограничениями. Chromium не сообщает эти размеры при загрузке страницы в скрытую вкладку, например, при восстановлении с предыдущего сеанса. У Safari, похоже, нет этой проблемы..

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

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

Ответ 2

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

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

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

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

Я знаю, что ни один из этих подходов не идеален, извините.

Ответ 3

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

var isPhantom = !!window.callPhantom;

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

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

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

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