Pull to refresh

Comments 78

Метод аяксовой кнопки — использовал как-то такой метод
только у меня не кнопка, а целиком форма дергалась через ajax, а в ней скрытый рандомный токен и сверка на серверной стороне
в результате если не получили форму через ajax — не получили токен, а значит и сделать ничего не могут
Для спамера, все проблемы свелись только к тому, что вместо одного запроса, теперь нужно посылать два. сначала узнаем код, потом подставляем его во второй запрос и успешно его отправляем. На полноценную замену капчи не тянет.
Автор упирает на то, что универсальному роботу проще обойти стороной его сайт.
Все верно — для универсального бота, достаточно ЛЮБОЙ нестандартной защиты (1й метод самое оно)
А от бота специализированного на вашем сайте — вы универсальную защиту не придумаете :)
А вы попробуйте.

Сначала зайдите в форму.
Потом задайте пробный коммент
Потом определите, что за алгоритм работает
Потом поэкспериментируйте с бэкендом, который коды выдает
Потом попрубуйте скомбинировать одно(!) пробное письмо со спамом
Потом, когда увидите, что письмо не прошло, догадайтесь, что код работает ограниченное время
Потом сделайте программу специальную для спама именно моего сайта.

Потом плюньте на это дело, и решите, что легче спамить какие-нибудь другие сайты.
Метод аяксовой кнопки будет работать пока спамеры не освоят phantomjs. Странно, что до сих пор не освоили, он уже давно существует. Впрочем он довольно медленный, может это их останавливает.
CasperJS это удобная надстройка над headless. В контексте PhantonJS правильнее вспомнить SlimerJS (любителям FireFox). Хотя как ни крути проект этот выступает в роли догоняющего.
Метод аяксовой кнопки можно свести к нулю, если использовать браузеры в бекграунде или что-то вроде pyv8, spydermonkey которые позволят запустить javascript в сендбоксе и получить вывод (делал похожее, работает с DOM эмулятором).

Есть вариант проверять кнопочный или мышечный ввод.
Иной вариант, шифровать данные. Еще другой вариант, давать клиенту выполнять времязатратную работу (вроде биткоинового расчета). Чем больше запросов из одной сессии или от одного пользователя, тем дольше работу пусть js выполняет.
spidermonkey все же js движок и он не даёт нормальный DOM. Выполнять в нем код со страницы как есть не получится. Как и v8. ОЧЕНЬ много (в сравнении с phamtomjs) приходиться допиливать.
github.com/andreasgal/dom.js

Вот это исправляет этот недостаток, проверено (делал антивирус для веб сайтов, который эмулировал js).
На сколько там адеватный DOM? Каким образом подхватывается JS со страницы?
К примеру, при использовании PhantomJS через webdriver можно вообще этим не запариваться и нужно просто тупо написать XPath выражения для навигации/манипуляции по дереву. Со spidermonkey так нельзя, приходится выдергивать нужные куски JS-а со страницы, примешивать свой JS и только после этого получить данные. Сложно сапортить, требуется много времени (раза в 2-6 больше, чем для PhantomJS) в случае модификации исходных JS. Как с этим у данного проекта?
GoogleBot давно отправляет ajax-запросы, бывает с разных ip или с задержкой, но сам факт. Так что спамеров, думаю, не долго ждать осталось.
В том, что роботы не умеют закачивать и обрабатывать скрипты JavaScript.

И в этот самый момент вам в окно постучал бот на WebDriver.
Я писал робота, который парсит сайты, задействуя при этом headless webkit. Так что никаких проблем написать робота с выполнением js нет и спамеры и прочие ботоводы это знают.
Нужно, чтобы имена полей в форме не имели смысловой нагрузки.
А как же автозаполнение? Лучше ввести 4 цифры капчи, чем вручную заполнять все поля заказа. А как же сохранение логина/пароля?

Уж если есть задача защититься от универсальных роботов без капчи, то лучше исходить от обратного: роботы заполняют поля с понятными им названиями. Добавляем такое поле, делаем ему display: none; и autocomplete=off, а на сервере проверяем его наличие и пустоту.
Так логин/пароль надо сохранять в форме логина, а автор про форму регистрации.

А вот способ «от обратного» поддерживаю, сам об этом подумал.
Года три подобный метод используем, пока ни одной осечки.
Писал несколько десятков интернет-магазинов, вариант с display: none; практически не работает.
Может, конечно, наши магазины привлекали каких-то особенных ботов.
А display: none куда убирали? Мы обычно прячем в css за сложным селектором. И от названия поля тоже много зависит. Естественно вариант не спасет, если спамить будут конкретный сайт, но от случайных ботов очень даже.
>А display: none куда убирали?
уже не помню, больше 5 лет не занимаюсь разработкой
Сложный селект, «крыть хитро без display: none, z-index-ами и наложением» как предлагает Blumfontein тоже не вариант в случае headless browser. Потому что бот видит/не-видит ровно то, что и все остальные посетители.
Разумеется, но таких ботов маловероятно будут пускать просто бродить по интернету в поисках куда наспамить. Такая защита поможет для небольших сайтов и от случайно забредших роботов, и судя по опыту помогает в этом случае не плохо.
Ну я бы сказал так… В текущий момент нужно слишком много железа что бы такой бот бродил по инету вслепую. Но решаема и эта задача. Такой бот может провести анализ в один поток, медленно, тяжело… но в итоге сгенерит набор правил для более легковестных систем (через тот же curl). Я думаю таких систем со временем будет появляться больше и больше. Ну и да, написать алгоритм генерации правил непросто, что и сдерживает этот процесс.
Решить можно почти любую задачу, вопрос рентабельности. До тех пор, пока есть сайты без защиты вовсе или же с примитивной капчей, то рентабельней спамить их, чем придумывать столь нетривиальные подходы. По этому пока работает, будем использовать :)
>> вариант с display: none; практически не работает

Можно скрыть хитро без display: none, z-index-ами и наложением
Можно не скрывать, а честно написать: «заполните это поле, если вы спамер»
Аякс-кнопка и другие изощрения помогут только против школьных скриптов, современные боты быглядят как оттюненный phantomjs c отправкой разгадывания капчи индусам.
У нас индусы разгадывают капчи при необходимости + закупаем пулл аддресов. Каждый новый запрос приходит и нового адреса и с рендомным юзерагентом. Используется phantom+curl в несколько потоков.
PS. Используем не для спама а для парсинга. Прошу смотреть на это с професиональной точки зрения.
Иногда полезно сохранять связку прокси с определённым юзерагентом/кукой. Если я правильно понял, что работает одновременно несколько инстансов фантома, то подскадите, сколько у вас это все потребляет памяти?
«Нужно, чтобы имена полей в форме не имели смысловой нагрузки»
Это если проверять по полю name, а есть ведь еще type
password / email по умолчанию, остальные допустим text, уже легче
И как вариант бот может не раздумывая какой name что означает просто рандомно перебором посылать все возможные варианты, каждая 5-10 попытка будет проходить.
использую метод создания токена с помощью js для одного из полей.
срабатывает при submit и не требует ajax.
избавляет от автоматического спама
за несколько лет не припомню чтобы пролезло что-нибудь — причем у меня токен никогда не меняется и виден в коде.
идеально подойдет для малоизвестных сайтов.
UFO landed and left these words here
Автор, а как быть, если бот будет использовать PhantomJS, CEF или Selenium?

P.S. Я буду обновлять комментарии перед отправкой, я буду обновлять комментарии перед отправкой…
Говорю совершенно откровенно. Я не знаю, как быть.

Мне хотелось бы для начала ознакомиться хоть с одним таким событием. На мое сборщике спама стоят все возможные, как мне кажется ловушки. Если будет событие прохода спама, то я, наверное, посмотрю, поймалось ли что-нибудь в ловушки.

Если спаммер будет программно нажимать на Яваскриптовую кнопку, то, боюсь, кроме капчи не будет спасенья.

Но тогда я буду выступать за более приличные капчи. Где не нужно глаза ломать и сильно напрягаться (я плохо вижу). Я за капчу в виде вопроса. Например, «Введите цифрами число 747». Причем в словаре должны быть не однотипные вопросы, а разные. Выраженные разными словами и не имеющими общей схемы.

Но заметьте. Спаммеры хотят нас спамить! При этом борьба с JS явилась бы для них прорывом! Но эта технология не внедряется повсеместно и быстро. Значит есть какие-то сложности в этом деле и мы еще поживем!
Ну, а для вопросов «введите цифрами число 747» есть рендеринг части страницы в картинку и ручные сервисы по распознаванию капчи (причем копеечные — порядка 2$ за тысячу капчей), с кучей русскоязычных работников в том числе.
Я ошибся, прошу прощения.
Вопрос «введите цифрами число семьсот сорок семь»
В другой раз должен быть другой вопрос, например, «сколько минут в часе?»
В третий раз «А правда, что в часе 60 минут? Ответьте да или нет»
В четвертый «А в сутках двадцать четыре часа или двадцать пять?» Введите ответ цифрами

и так далее по списку готовых вопросов. Боюсь, тут нужен искусственный интеллект, что отвечать на такие вопросы.

И вот тут мы плавно переходим еще к одной очень интересной теме. На вопрос «Какой спутник планеты Земля» (ответ Луна) порядка 10% пользователей не могут дать правильного ответа, и от них идут письма администратору. Некоторые письма с текстом «Что за безобразие ваша капча???» Другие письма «Программисты, исправьте капчу, она не работает!» Проблема, буду крайне толерантным, в первичном отборе пользователей.

Графическая же капча отбирает только тех, у кого хорошие глаза и крепкие нервы.
тут нужен искусственный интеллект, что отвечать на такие вопросы
Зачем искусственный, когда есть вполне себе натуральный интеллект, который не прочь заработать 2$ за 1000 ответов на глупые вопросы? Под русскоязычными работниками я имел в виду не саппорт, конечно же, а самих «распознавателей».
Значит нужно бороться и с натуралами, которые хотят заработать! Например:

image
Капча с вопросами ограничена набором этих вопросов. А значит ее можно взять брутфорсом и составить справочник, после чего она перестает существовать. Естественно, от спамера опять же требуется индивидуальный подход к сайту.
Учитывать время на заполнение формы, события focus, движение мыши по экрану, нажатие таба, скролл и тд. Все вещи которые сложно подделать, но делаются обычными пользователями. Хотя для малого сайта это оверкилл, по моему.
random может это покрыть. отправлять столько событий сайт будет супер-медленным, плюс возможность ддоса открывается.
Кроме движения мыши, остальные события не слишком многочисленны. Для мыши можно сделать доклад о движениях.
Рандом не поможет, если анализировать информацию и проверять, что действия логичны. К тому же, рандом это вобщем-то белый шум, а человек так себя не ведет. Конечно можно написать неправильный рандом, но это упирается в желание спамера заспамить сайт. Написать этот метод непросто, как и метод его обхода.
От ддоса тоже можно спастись.
Проблема в том, что все, что можно проанализировать, значит можно автоматизировать.

Никакого неправильного рандома не надо. Записали движение нормальные скриптом (делается проще простого), а потом даем отклонения небольшие в пару пикселей.
Заставьте через JS делать proof-of-work. Это рабочий вариант.

Другой вариант слушать ввод букв и движения/клики мышки, тогда можно предсказать, робот это или человек.

Proof-of-work проще и намного быстрее реализовать.
движения мыши? мобильные браузеры шлют вам привет
одна из любимых баек про «рекапча 2» что он слушает движения мыши и по ним понимает человек ли это))
У меня двойственные ощущения от прочтения статьи.

С одной стороны, я однозначно «за» повышение грамотности разработчиков, поэтому ещё одна статья, где описываются подходы излишней не будет. Да и написана достаточно толково.

С другой стороны, явный велосипедизм. «Метод переменных полей» (чаще его называют методом скрытых полей). Нужно сказать, что Котеров ещё в 2005 — 2006 годах описывал механизмы работы с формами, в том числе описывая и «цифровую подпись формы» — в терминах автора «методика разрешите войти». Велосипед хорошо обкатан, автор хорошо понял за много лет тонкости вопроса, поэтому не могу сказать, что это такой уж сильный грех.

Ну и напоследок. Подходы, которые описаны в статье неплохо работали последние 10 лет, некоторое время ещё послужат. Но технологии не стоят на месте — нужно готовиться не к войне вчерашней, а завтрашней — с ботами, умеющими выполнять JS.

P.S. Я буду обновлять комментарии перед отправкой.
Я согласен с вами на 100%

В поддержку вашего комментария добавлю.

По моему опыту роботы из года в год все такие-же унылые и работают по одному и тому же алгоритму, ничего не меняя, не соврешенствуясь, не используя новых алгоритмов. При этом хозяева роботов однозначно разные. Я проверяю их айпишники по www.projecthoneypot.org и иногда, очень редко, по содержимому. Кто-то специализируется только на виагре с циалисом и никуда с этих позиций не двигается, как ни странно.

У меня какое-то время была тоже капча, примерно, как в вашем посте, только я еще и ответ писал. У меня был вопрос типа: «Сколько будет 345 помножить на 312? Ответ: 107640». И никаких «пролетов»! Ни один робот не был на такую наглость рассчитан.

Причем графическую капчу читать могли и читали просто на ура!

Я, если честно, не знаю иерархии в среде спаммеров. Есть, например, среди них начинающие, тренирующиеся и гуру? Как отбираются сайты, достойные внимания гуру? По каким признакам и параметрам? Все это очень интересные вопросы, если влезать в тему реально глубоко.

Вот еще очень хороший вопрос. Антиспам-подходы Яндекса и Гугла, как самых крутых для примера? Эти подходы формируются из реальных нападений, или админы просто такие же программеры, как мы и многократно перестраховываются просто из соображений огромной ответственности, которая на них лежит?
UFO landed and left these words here
На паре свои сайтов сделал еще проще — просто добавил поле и рядом надпись, просящую ввести написанное прописью число цифрами. За несколько лет число спамовых регистраций — единицы.
Вся суть такой защиты в том, чтобы быть уникальной, чтобы спамерам дороже было плюнуть на сайт, чем заморачиваться с правкой скриптов.
написанное прописью число
Но разве это не самая обыкновенная графическая капча?
Предполагается, что вопрос написан нормальным шрифтом, не исковерканным, и буквы не налезают друг на друга, нет ряби, снега, наклонов в разные стороны и всего остального, что есть в современных графических капчах.
UFO landed and left these words here
Помните рапидшару с ее котиками году так в 2008-м? Сломали же в конце концов. :)
Нет, число было написано простым текстом без всяких картинок. Т.е. там текст что-то типа «введите число тысяча пятьдесят цифрами».
Вы не упомянули о варианте использования анти-капчи, это когда есть скрытое поле например с именем email и вы решаете что при использовании формы человеком это поле всегда будет пустым. Тупой бот конечно-же заполнить это поле и тогда вы сможете его определить. Успех тоже весьма сомнителем но такая методика существует.
Всё упирается в мотивацию спамера.
Если у вас обычный сайт с сотней посетителей в сутки, спаммеру скорее всего не будет интересно затачивать решение — затраты время/профит несоразмерны, ему будет проще потратить время на другие сайты.
Если взять за пример сервисы Яндекса — то на следующий же день после ввода такой «капчи», без кавычек тут уж никак, в добрый десяток инструментов типо хрумера и яззла встроят автоматический обход.
Тоже самое и с массовым внедрением подобной «капчи» в CMS/форумы — обход данной «капчи» повысит профит, не тратя денег на распознавание графических капч людьми по 2$ за 1000 капч.
А для мелкого сайта с такой «капчей» идеально работает принцип неуловимого Джо. Вас не спамят только потому, что это никому не нужно.
Наивный вопрос.
Интересно, а почему нельзя окружить кнопку отправки формы графическими элементами с событием «onMouseOver» тогда при переходе на данное поле будет генерироваться событие — которое меняет параметр, говорящий что пользователь — не робот.
Можно. И спамеры сразу станут сразу добавлять этот параметр в отправку.
про тач-скрины не слышали?
И про отправку формы по Enter, видимо, тоже.
И про расширения для сёрфинга с клавиатуры (KeySnail/Vimperator/Pentadactyl/etc). Но что характерно, новая рекапча отрабатывает, даже если после нажатия галочки ничего не делать.
Все упирается в то, стоит ли ваш сайт усилий, чтобы его проспамить. Если вы ВК, или ФБ, то даже с кастомными формами и аякасми под вас напишут спам-скрипты, или даже наймут людей из Бангладеша для ручного постинга. А если вы никому неизвестный форум, то вам хватит и простого дополнительного вопроса в форме.

Edit. Пока писал пост akirsanov написал ровно тоже.
Первый описанный Вами метод хорошо известен. Это технология moving target defense. Пару лет назад натыкался на описание фреймворка как раз с постоянным изменением идентификаторов полей в форме. Валяется где-то файл, могу скинуть если интересно.

Третий метод работать не будет, поскольку очень прост в обходе. В автосигнализациях (диалоговых) происходит передача нескольких пакетов для того чтобы не передавать в открытом виде ключ, который есть на брелке, а только удостовериться что брелок его знает. В вашем случае никакого ключа нет, просто происходит две итерации. Работать он будет в том случае, если по той же технологии MTD постоянно менять логику взаимодействия клиента и сервера. Тогда потенциальному роботописцу придется непрерывно переписывать логику робота до тех пор пока он не поймет по какому принципу эта логика меняется.
Первый метод можно обойти.
В наши дни эти методы работают только против школьников и автоботов. Защиты чисто технически уже недостаточно. Бот на phantonjs+xpath пишется за 2-10 часов под любой сайт на котором есть люди.

P.S. Рекомендую написать бота.
Данную проблему можно кардинально решить
Вариант 1. Оставить на сайте только вход через соц.сети.
Вариант 2. Сделать регистрацию через телефон и СМС подтверждение.

Мне кажется что стандартную регистрация с её проблемами и сложностью создания пароля (с длиной, разным регистром, спец символами) для клиента на большинстве сайтов можно смело убирать.
1 Вход через соц сети это зависимость от безопасности соц сети. Тот же фейсбук имел столько уязвимостей что кроме как на игрушки логин по фейсбуку ставить нельзя ни в коем случае.

2 Если задача задолбать клиента то можно попросить их ввести 10 капч. Я сайты требующие мой телефон либо избегаю либо ищу get sms online в гугле
Вход через соцсети, на мой взгляд, плох вовсе не из-за безопасности (точнее, не в первую очередь). Вход через соцсети требует от пользователя наличия аккаунта в одной из них.
Помимо этого, соцсеть знает, где регистрируется пользователь, а сайт знает аккаунт в соцсети — это не всегда приемлемо для пользователя.
А еще лично я использую в соцсетях сложные длинные пароли. Многие сайты не стоят такой сложности, но при авторизации на них я вынужден пользоваться сложным паролем соцсети, что особенно раздражает на мобильных устройствах.
Оставить на сайте вход только через соц.сети.
Это отлично! Чтобы сразу было понятно, на какие сайты лучше не ходить.
Любая защита от бота обходится. Ваши — вообще в два счета, в виртуальном браузере. Если задача защититься от универсального спамера то способов куча, посчитать 2+2 в JS хватит.

Посмотрите чем занимаются shapesecurity.com

Если бы была замена капче, она бы уже стояла на всех популярных сайтах. Самая интересная альтернатива — hashcash
Или достаточно просто подключить новую, великолепную рекапчу от гугля.
время, когда запрос становится недействительным, например, 30 секунд
Передаю лучи поноса от лица пользователей GPRS.

И да, перечисленные трюки легко обходятся с помощью PhantomJS, который уже широко используется при создании ботов.
Only those users with full accounts are able to leave comments. Log in, please.