Капча всем известна. Также всем известно, что она представляет собой большую проблему и для программистов и для пользователей. Она ни тем ни другим не нравится! Ее приходится использовать по необходимости!

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

Последний предлагаемый метод спорный, но судите сами!

Метод переменных полей


Имеем простую форму с кнопкой типа submit.

Это самый простой, канонический вариант. Мы заполняем форму, нажимаем кнопку типа submit, и элементы формы передаются какому-то скрипту тем или иным методом для обработки.

Спаммер не напрягается с заполнением полей, а сразу, напрямую, вызывает нужный скрипт с нужными параметрами. В этом случае определить, человек нажал на кнопку, или скрипт вызван напрямую затруднительно.

Возможные методы борьбы

Нужно, чтобы имена полей в форме не имели смысловой нагрузки. Не имели названий "name", "last-name", "tel", "mail" и так далее. Роботизированные спаммерские скрипты ориентируются именно на это. По моему опыту наблюдения за спаммерскими роботами, они заполняют те поля, которые знают, как заполнить, а те поля, где затрудняются, оставляют пустыми, или вставляют козырную фразу «Antispam SUXXX». За долгие годы испытаний ни один робот не заполнил у меня в испытательной форме поле «ntspm». Другими словами, если сделать форму всего с одним важным, но непонятным для робота полем, например, вместо поля с именем «login» использовать имя «l__in_001», то это поле робот заполнить не сможет. По крайней мере вероятность этого довольно велика.

Можно пойти дальше и запрограммировать свои формы так, что названия полей будут меняться каждый день. Например, можно брать нормальное имя поля, например, «telephone», прибавлять к нему «отпечатки пальцев» в виде сегодняшнего числа, брать от получившейся строки md5-хэш, как самый производительный из хэшей, и использовать его в качестве имени поля за указанное число.

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

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

Метод аяксовой кнопки


Простая форма. Все как в методе «переменных полей», но обрабатываемая аяксом. Кнопка, которая раньше была типа «submit», теперь у нас имеет тип «button». По нажатии на кнопку срабатывает скрипт JavaScript, который отсылает всю форму сразу, или отдельные поля этой формы на сервер.

В чем суть защиты? В том, что роботы не умеют закачивать и обрабатывать скрипты JavaScript. Роботы — звери серверные, а скрипты JavaScript — звери клиентские. Тут идет нестыковочка технологий. Звери наши живут в разных клетках. И этот метод не дал ни одной осечки на моем сайте статей. Он прекрасно работал и работает до сих пор. Но есть нюанс.

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

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

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

Мы можем запретить прямой вызов бэкенда. Это слабая защита, но иногда срабатывает. Запрет этот лично я реализовал с помощью механизма сессий.

Метод, который я назвал бы «разрешите войти»


Это тот самый метод, который мне кажется спорным. Я использую его за некоторую специфическую изощренность и эстетическую странность и необычность (мое личное мнение). В чем же его суть?

Перед тем, как углубляться, хочу немного отвлечься.

Отступление № 1

Давайте предположим, что у нас на форме есть hidden input. Перед тем, как отправить форму на сервер, мы заполняем этот инпут чем-то и по наличию этого «чего-то» мы и судим — робот у нас был или человек. Предлагаемый ход — это некоторое видоизменение метода «аяксовой кнопки». Суть в использовании клиентского скрипта, который недоступен роботу. Но мы сразу вынуждены заметить, что метод будет хорошо работать, только если содержимое этого поля всегда будет разное. Не так ли работает обычная капча?

Отступление № 2

К моей предыдущей статье про методы защиты сайта на публичном хостинге было дано много комментариев. Некоторые из них имели тот лейтмотив, что бороться со взломом невозможно, ибо вас всегда взломают, если кому-то это действительно нужно. Я согласен с этим выводом, но не согласен с тем, что не нужно бороться! Точно такой же лейтмотив присутствует на форумах автосигнализаций. Там ситуация очень похожая. Суть тамошней уязвимости в том, что вы нажимаете на кнопку брелка, код ваш перехватывается приемником из соседней машины с тонированными окнами, глотается им, код охраны подменяется и ваш автомобиль ставится на охрану чужим кодом! Все! Грош цена вашей сигнализации! Тогда наши коллеги из сферы автосигнализаций придумали следующий метод решения проблемы. А что, если брелок будет посылать на автомобиль не команду "Встать на охрану с кодом таким-то", а вопрос "Можешь ли ты встать на охрану с кодом таким-то?" И если ответ положительный, то автосигнализация отвечает. "Становлюсь на охрану с этим кодом и посылаю его обратно для проверки". Брелок проверяет совпадение кода посланного, присланного обратно, и если они совпадают, то машина стоит на охране с вашим, а не с чужим кодом. Задача решена. А если не совпадают, то запрос нужно просто повторить. Автолюбитель этого даже не узнает.

Может похожий метод решить вопрос капчи?

Я попытался!

Укрупненный алгоритм работы формы

  • Форма заполняется данными.
  • Нажимается кнопка отправки.
  • На сервер аяксом посылается запрос типа «Собираюсь зарегистрировать пользователя.»
  • Сервер регистрирует запрос в базе данных или в простом файле, регистрирует время запроса и время, когда запрос становится недействительным, например, 30 секунд. После этого код запроса в виде строки (хэша) отправляется обратно.
  • Наш клиентский скрипт записывает этот код в наш input hidden с именем «ntspm» и смело отправляет все параметры на сервер.
  • Сервер берет код из хидден параметра. Проверяет его наличие в списке зарегистрированных кодов, проверяет, не истекло ли время, совпадает ли тип операции, и если все совпало — регистрирует пользователя в полной уверенности, что это был живой человек.

Есть слабые места? Да есть. Спаммер может сделать программу, которая будет посылать запрос кода, потом подставлять этот код в свою посылку. Но это будет индивидуальный робот именно для вашего сайта, и что-то мне подсказывает, что для простого сайта, для интернет-магазина и даже для приличного интернет-магазина никто программу такую писать не будет специально. Обломятся! А если мы скомбинируем этот метод с усилителями из предыдущих методов, то можно довести степень распознования робота до очень высокого процента. Боюсь вот так тыкать пальцем в небо, но я бы дал процентов 98,5. Просто потому, что проблем для спаммера столько, что честное слово, легче зайти живому человеку и ручками послать все, что нужно. Капча в случае с живым человеком, понятное дело, не поможет.

Резюме


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

Я по долгу службы часто захожу в сервис «Подбор слов» от Яндекса. Там теперь на каждый запрос стоит капча. Если это метод замедления работы пользователя, типа "Подумай еще раз! Может тебе эта инфа на самом деле не нужна?", то тогда понятно. Но если это реально защита от роботов, то почему бы не поставить обычную кнопку с надписью «Продолжить» и использовать один из вышеприведенных методов с усилителями?

Давайте сделаем интернет чуть-чуть удобнее!

Ссылки


Мой сборщик спама. Сайт этот не для людей! Его оформление призвано это продемонстрировать. В нем (по ссылке «добавить объявление») реализован метод «разрешите войти» без усилителей. За много лет ни одного «пролета» не было. Но справедливости ради хочу уточнить, что «пролетов» не было и на методе «аяксовая кнопка» без усилителей. Да и роботы всегда меня одни и те же посещают и все они без изысков, что очень жаль.

Комментарии (78)


  1. MetaDone
    04.08.2015 13:43

    Метод аяксовой кнопки — использовал как-то такой метод
    только у меня не кнопка, а целиком форма дергалась через ajax, а в ней скрытый рандомный токен и сверка на серверной стороне
    в результате если не получили форму через ajax — не получили токен, а значит и сделать ничего не могут


  1. runcore
    04.08.2015 13:58
    +9

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


    1. Urvin
      04.08.2015 13:59

      Автор упирает на то, что универсальному роботу проще обойти стороной его сайт.


      1. FreeMind2000
        04.08.2015 21:14
        +3

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


    1. belkin-labs
      04.08.2015 14:03
      -9

      А вы попробуйте.

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

      Потом плюньте на это дело, и решите, что легче спамить какие-нибудь другие сайты.


  1. xdenser
    04.08.2015 14:05
    +14

    Метод аяксовой кнопки будет работать пока спамеры не освоят phantomjs. Странно, что до сих пор не освоили, он уже давно существует. Впрочем он довольно медленный, может это их останавливает.


    1. Antex
      04.08.2015 15:42

      или casperjs


      1. alekciy
        05.08.2015 18:28

        CasperJS это удобная надстройка над headless. В контексте PhantonJS правильнее вспомнить SlimerJS (любителям FireFox). Хотя как ни крути проект этот выступает в роли догоняющего.


    1. equand
      04.08.2015 16:13
      -1

      Метод аяксовой кнопки можно свести к нулю, если использовать браузеры в бекграунде или что-то вроде pyv8, spydermonkey которые позволят запустить javascript в сендбоксе и получить вывод (делал похожее, работает с DOM эмулятором).

      Есть вариант проверять кнопочный или мышечный ввод.
      Иной вариант, шифровать данные. Еще другой вариант, давать клиенту выполнять времязатратную работу (вроде биткоинового расчета). Чем больше запросов из одной сессии или от одного пользователя, тем дольше работу пусть js выполняет.


      1. alekciy
        04.08.2015 23:56

        spidermonkey все же js движок и он не даёт нормальный DOM. Выполнять в нем код со страницы как есть не получится. Как и v8. ОЧЕНЬ много (в сравнении с phamtomjs) приходиться допиливать.


        1. equand
          05.08.2015 00:28

          github.com/andreasgal/dom.js

          Вот это исправляет этот недостаток, проверено (делал антивирус для веб сайтов, который эмулировал js).


          1. alekciy
            05.08.2015 18:26

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


    1. skey
      04.08.2015 19:55
      +1

      GoogleBot давно отправляет ajax-запросы, бывает с разных ip или с задержкой, но сам факт. Так что спамеров, думаю, не долго ждать осталось.


  1. maxru
    04.08.2015 14:24
    +10

    В том, что роботы не умеют закачивать и обрабатывать скрипты JavaScript.

    И в этот самый момент вам в окно постучал бот на WebDriver.


    1. Bonch
      05.08.2015 01:00
      +1

      Я писал робота, который парсит сайты, задействуя при этом headless webkit. Так что никаких проблем написать робота с выполнением js нет и спамеры и прочие ботоводы это знают.


  1. dyll
    04.08.2015 14:32
    +12

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

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


    1. dom1n1k
      04.08.2015 15:43
      +2

      Так логин/пароль надо сохранять в форме логина, а автор про форму регистрации.

      А вот способ «от обратного» поддерживаю, сам об этом подумал.


    1. levchick
      05.08.2015 09:09
      +1

      Года три подобный метод используем, пока ни одной осечки.


    1. msfs11
      05.08.2015 10:42
      +2

      Писал несколько десятков интернет-магазинов, вариант с display: none; практически не работает.
      Может, конечно, наши магазины привлекали каких-то особенных ботов.


      1. levchick
        05.08.2015 13:38
        +1

        А display: none куда убирали? Мы обычно прячем в css за сложным селектором. И от названия поля тоже много зависит. Естественно вариант не спасет, если спамить будут конкретный сайт, но от случайных ботов очень даже.


        1. msfs11
          05.08.2015 14:07
          +1

          >А display: none куда убирали?
          уже не помню, больше 5 лет не занимаюсь разработкой


        1. alekciy
          05.08.2015 15:29
          +1

          Сложный селект, «крыть хитро без display: none, z-index-ами и наложением» как предлагает Blumfontein тоже не вариант в случае headless browser. Потому что бот видит/не-видит ровно то, что и все остальные посетители.


          1. levchick
            05.08.2015 16:17
            +1

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


            1. alekciy
              05.08.2015 18:20

              Ну я бы сказал так… В текущий момент нужно слишком много железа что бы такой бот бродил по инету вслепую. Но решаема и эта задача. Такой бот может провести анализ в один поток, медленно, тяжело… но в итоге сгенерит набор правил для более легковестных систем (через тот же curl). Я думаю таких систем со временем будет появляться больше и больше. Ну и да, написать алгоритм генерации правил непросто, что и сдерживает этот процесс.


              1. levchick
                05.08.2015 21:36

                Решить можно почти любую задачу, вопрос рентабельности. До тех пор, пока есть сайты без защиты вовсе или же с примитивной капчей, то рентабельней спамить их, чем придумывать столь нетривиальные подходы. По этому пока работает, будем использовать :)


      1. Blumfontein
        05.08.2015 13:59
        +2

        >> вариант с display: none; практически не работает

        Можно скрыть хитро без display: none, z-index-ами и наложением


        1. rubyrabbit
          06.08.2015 15:52

          Можно не скрывать, а честно написать: «заполните это поле, если вы спамер»


  1. AlexGx
    04.08.2015 14:35
    +9

    Аякс-кнопка и другие изощрения помогут только против школьных скриптов, современные боты быглядят как оттюненный phantomjs c отправкой разгадывания капчи индусам.


    1. Tramvai
      04.08.2015 18:57
      +2

      У нас индусы разгадывают капчи при необходимости + закупаем пулл аддресов. Каждый новый запрос приходит и нового адреса и с рендомным юзерагентом. Используется phantom+curl в несколько потоков.
      PS. Используем не для спама а для парсинга. Прошу смотреть на это с професиональной точки зрения.


      1. SlimHouse
        20.08.2015 02:50

        Иногда полезно сохранять связку прокси с определённым юзерагентом/кукой. Если я правильно понял, что работает одновременно несколько инстансов фантома, то подскадите, сколько у вас это все потребляет памяти?


  1. NeXTs_od
    04.08.2015 14:46
    +1

    «Нужно, чтобы имена полей в форме не имели смысловой нагрузки»
    Это если проверять по полю name, а есть ведь еще type
    password / email по умолчанию, остальные допустим text, уже легче
    И как вариант бот может не раздумывая какой name что означает просто рандомно перебором посылать все возможные варианты, каждая 5-10 попытка будет проходить.


  1. ekim
    04.08.2015 15:02

    использую метод создания токена с помощью js для одного из полей.
    срабатывает при submit и не требует ajax.
    избавляет от автоматического спама
    за несколько лет не припомню чтобы пролезло что-нибудь — причем у меня токен никогда не меняется и виден в коде.
    идеально подойдет для малоизвестных сайтов.


  1. m0Ray
    04.08.2015 15:08

    > роботы не умеют закачивать и обрабатывать скрипты JavaScript
    Лет N назад это ещё могло быть верным. С появлением таких фреймворков, как SlimerJS и PhantomJS ситуация поменялась.


  1. mwizard
    04.08.2015 15:08
    +3

    Автор, а как быть, если бот будет использовать PhantomJS, CEF или Selenium?

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


    1. belkin-labs
      04.08.2015 15:34

      Говорю совершенно откровенно. Я не знаю, как быть.

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

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

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

      Но заметьте. Спаммеры хотят нас спамить! При этом борьба с JS явилась бы для них прорывом! Но эта технология не внедряется повсеместно и быстро. Значит есть какие-то сложности в этом деле и мы еще поживем!


      1. mwizard
        04.08.2015 15:37
        +1

        Ну, а для вопросов «введите цифрами число 747» есть рендеринг части страницы в картинку и ручные сервисы по распознаванию капчи (причем копеечные — порядка 2$ за тысячу капчей), с кучей русскоязычных работников в том числе.


        1. belkin-labs
          04.08.2015 15:50

          Я ошибся, прошу прощения.
          Вопрос «введите цифрами число семьсот сорок семь»
          В другой раз должен быть другой вопрос, например, «сколько минут в часе?»
          В третий раз «А правда, что в часе 60 минут? Ответьте да или нет»
          В четвертый «А в сутках двадцать четыре часа или двадцать пять?» Введите ответ цифрами

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

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

          Графическая же капча отбирает только тех, у кого хорошие глаза и крепкие нервы.


          1. mwizard
            04.08.2015 15:52
            +1

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


            1. aratak
              05.08.2015 11:49
              +4

              Значит нужно бороться и с натуралами, которые хотят заработать! Например:

              image


          1. Iv38
            05.08.2015 11:50
            +1

            Капча с вопросами ограничена набором этих вопросов. А значит ее можно взять брутфорсом и составить справочник, после чего она перестает существовать. Естественно, от спамера опять же требуется индивидуальный подход к сайту.


      1. aikixd
        04.08.2015 15:58
        +2

        Учитывать время на заполнение формы, события focus, движение мыши по экрану, нажатие таба, скролл и тд. Все вещи которые сложно подделать, но делаются обычными пользователями. Хотя для малого сайта это оверкилл, по моему.


        1. equand
          04.08.2015 16:18
          -1

          random может это покрыть. отправлять столько событий сайт будет супер-медленным, плюс возможность ддоса открывается.


          1. aikixd
            04.08.2015 16:41
            +1

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


            1. equand
              04.08.2015 19:17

              Проблема в том, что все, что можно проанализировать, значит можно автоматизировать.

              Никакого неправильного рандома не надо. Записали движение нормальные скриптом (делается проще простого), а потом даем отклонения небольшие в пару пикселей.


      1. equand
        04.08.2015 16:17

        Заставьте через JS делать proof-of-work. Это рабочий вариант.

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

        Proof-of-work проще и намного быстрее реализовать.


        1. vikarti
          04.08.2015 20:15
          +1

          движения мыши? мобильные браузеры шлют вам привет


          1. Chikey
            05.08.2015 01:26
            +1

            одна из любимых баек про «рекапча 2» что он слушает движения мыши и по ним понимает человек ли это))


  1. questor
    04.08.2015 15:11
    +3

    У меня двойственные ощущения от прочтения статьи.

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

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

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

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


  1. belkin-labs
    04.08.2015 15:27

    Я согласен с вами на 100%

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

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

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

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

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

    Вот еще очень хороший вопрос. Антиспам-подходы Яндекса и Гугла, как самых крутых для примера? Эти подходы формируются из реальных нападений, или админы просто такие же программеры, как мы и многократно перестраховываются просто из соображений огромной ответственности, которая на них лежит?


  1. m0Ray
    04.08.2015 15:28

    А ещё на одном сайте я видел такую «капчу»: пользователю показывается четыре разноцветные цифры, причём прямо в HTML, а не картинкой, и надпись: «введите первые две цифры из четырёх». И ведь это работает!


    1. sHinE
      04.08.2015 15:38

      На паре свои сайтов сделал еще проще — просто добавил поле и рядом надпись, просящую ввести написанное прописью число цифрами. За несколько лет число спамовых регистраций — единицы.
      Вся суть такой защиты в том, чтобы быть уникальной, чтобы спамерам дороже было плюнуть на сайт, чем заморачиваться с правкой скриптов.


      1. mwizard
        04.08.2015 15:53

        написанное прописью число
        Но разве это не самая обыкновенная графическая капча?


        1. belkin-labs
          04.08.2015 15:58

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


          1. Temirkhan
            04.08.2015 16:16
            +1

            Мне ближе вопрос, который просит выбрать картинку с правильным ответом на вопрос, но при этом вопросы не имеют единую природу. Например:

            Вариант 1) Выберите картинку, на которой изображен паяльник.
            Вариант 2) Выберите самое крупное существо из изображенных.

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


            1. cjfynjy
              05.08.2015 02:36

              Помните рапидшару с ее котиками году так в 2008-м? Сломали же в конце концов. :)


        1. sHinE
          04.08.2015 18:23

          Нет, число было написано простым текстом без всяких картинок. Т.е. там текст что-то типа «введите число тысяча пятьдесят цифрами».


  1. Fuco
    04.08.2015 16:33
    +9

    Здесь нужно оставить комментарий про reCaptcha 2

    image

    Отличное решение с очень простой интеграцией.


    1. Chikey
      05.08.2015 01:23

      И обходится в 10 попыток twitter.com/homakov/status/625277071871340544


  1. vba
    04.08.2015 16:41

    Вы не упомянули о варианте использования анти-капчи, это когда есть скрытое поле например с именем email и вы решаете что при использовании формы человеком это поле всегда будет пустым. Тупой бот конечно-же заполнить это поле и тогда вы сможете его определить. Успех тоже весьма сомнителем но такая методика существует.


    1. Blumfontein
      05.08.2015 07:23
      +1

      honeypot называется


  1. akirsanov
    04.08.2015 17:46
    +4

    Всё упирается в мотивацию спамера.
    Если у вас обычный сайт с сотней посетителей в сутки, спаммеру скорее всего не будет интересно затачивать решение — затраты время/профит несоразмерны, ему будет проще потратить время на другие сайты.
    Если взять за пример сервисы Яндекса — то на следующий же день после ввода такой «капчи», без кавычек тут уж никак, в добрый десяток инструментов типо хрумера и яззла встроят автоматический обход.
    Тоже самое и с массовым внедрением подобной «капчи» в CMS/форумы — обход данной «капчи» повысит профит, не тратя денег на распознавание графических капч людьми по 2$ за 1000 капч.
    А для мелкого сайта с такой «капчей» идеально работает принцип неуловимого Джо. Вас не спамят только потому, что это никому не нужно.


  1. vorobyev
    04.08.2015 17:48

    Наивный вопрос.
    Интересно, а почему нельзя окружить кнопку отправки формы графическими элементами с событием «onMouseOver» тогда при переходе на данное поле будет генерироваться событие — которое меняет параметр, говорящий что пользователь — не робот.


    1. sergiks
      04.08.2015 18:24
      +1

      Можно. И спамеры сразу станут сразу добавлять этот параметр в отправку.


    1. vanxant
      05.08.2015 03:45
      +2

      про тач-скрины не слышали?


      1. rinat_crone
        05.08.2015 13:29

        И про отправку формы по Enter, видимо, тоже.


        1. bodqhrohro
          05.08.2015 15:21
          +1

          И про расширения для сёрфинга с клавиатуры (KeySnail/Vimperator/Pentadactyl/etc). Но что характерно, новая рекапча отрабатывает, даже если после нажатия галочки ничего не делать.


  1. amaksr
    04.08.2015 17:59
    +4

    Все упирается в то, стоит ли ваш сайт усилий, чтобы его проспамить. Если вы ВК, или ФБ, то даже с кастомными формами и аякасми под вас напишут спам-скрипты, или даже наймут людей из Бангладеша для ручного постинга. А если вы никому неизвестный форум, то вам хватит и простого дополнительного вопроса в форме.

    Edit. Пока писал пост akirsanov написал ровно тоже.


  1. styugin
    04.08.2015 19:03
    -1

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

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


    1. equand
      04.08.2015 19:22

      Первый метод можно обойти.


  1. customtema
    04.08.2015 20:15
    +1

    Cross Site Request Forgery


  1. alekciy
    05.08.2015 00:12
    +1

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

    P.S. Рекомендую написать бота.


  1. OlegoO
    05.08.2015 00:15
    +2

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

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


    1. Chikey
      05.08.2015 01:21

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

      2 Если задача задолбать клиента то можно попросить их ввести 10 капч. Я сайты требующие мой телефон либо избегаю либо ищу get sms online в гугле


      1. Iv38
        05.08.2015 12:09

        Вход через соцсети, на мой взгляд, плох вовсе не из-за безопасности (точнее, не в первую очередь). Вход через соцсети требует от пользователя наличия аккаунта в одной из них.
        Помимо этого, соцсеть знает, где регистрируется пользователь, а сайт знает аккаунт в соцсети — это не всегда приемлемо для пользователя.
        А еще лично я использую в соцсетях сложные длинные пароли. Многие сайты не стоят такой сложности, но при авторизации на них я вынужден пользоваться сложным паролем соцсети, что особенно раздражает на мобильных устройствах.


    1. dbanet
      05.08.2015 14:18
      +1

      Оставить на сайте вход только через соц.сети.
      Это отлично! Чтобы сразу было понятно, на какие сайты лучше не ходить.


  1. Chikey
    05.08.2015 01:19
    +1

    Любая защита от бота обходится. Ваши — вообще в два счета, в виртуальном браузере. Если задача защититься от универсального спамера то способов куча, посчитать 2+2 в JS хватит.

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

    Если бы была замена капче, она бы уже стояла на всех популярных сайтах. Самая интересная альтернатива — hashcash


  1. dkiselev
    05.08.2015 06:03
    -1

    Или достаточно просто подключить новую, великолепную рекапчу от гугля.


  1. bodqhrohro
    05.08.2015 15:17
    +1

    время, когда запрос становится недействительным, например, 30 секунд
    Передаю лучи поноса от лица пользователей GPRS.

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