Надежное обнаружение спам-ботов на базе PhantomJS
Есть ли способ последовательно обнаруживать PhantomJS/CasperJS? Я имел дело с плюсом вредоносных спам-ботов, построенных с ним, и мог в основном блокировать их на основе определенных видов поведения, но мне любопытно, есть ли способ узнать, использует ли CasperJS, поскольку имеет дело с постоянные адаптации немного раздражают.
Я не верю в использование Captchas. Это отрицательный пользовательский интерфейс, и ReCaptcha никогда не работал, чтобы блокировать спам в моих установках MediaWiki. Поскольку у нашего сайта нет пользовательских регистраций (анонимная доска объявлений), нам нужно иметь запись Captcha для каждой записи. Мы получаем несколько тысяч легитимных сообщений в день, а Captcha увидит, что число divebomb.
Ответы
Ответ 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.