2 сентября 2011 в 16:07

Алеша Попович vs Тугарин Змей или как я боролся со спамом

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

Заглянув под кат, я уверен, вы оцените его оригинальность.

Стоя на голове


Программировать или искать новую капчу мне помешал профессиональный навык, а именно ЛЕНЬ. В качестве оправдания я подумал, что как-то несолидно напрягать пользователей разбираться в непонятной буково-циферной куче символов.

Было решено обратится к радикальным методам решения. А именно УБРАТЬ КАПЧУ (если подумать так жизнь станет легче сразу трем «персонажам»: моему серверу, спам-ботам и юзерам).

В замен была создана простая бан-система по IP + пре-модерация комментариев. Все вроде хорошо, за исключением, что мне надоело банить ботов (на тот момент в базе к-во заблокированых IP приблизительно составляло 100). И тут скрипя зубами, стало ясно, нужно, что-то новое.

Наблюдательность — залог успеха


Понаблюдав за спам-комментариями дня 2, я заметил, что они (т.е. спам-боты) заполняют все поля, даже email, который не обязательный. Руководствуясь известной цитатой (сделай свои недостатки своим преимуществом), меня осенило.

Следуя логичности верстки, я добавил еще один input c именем phone и с помощью JavaScript делаю его скрытым(можно и через CSS).

Не долго пришлось ждать, чтобы увидеть, что спам-боты заполняют это поле, при чем только цифрами. Тогда в месте добавления комментариев добавляем проверку, если поле телефон заполнено, то это бот, если нет — доброжелательный юзер. Через пару дней я отключил, пре-модерацию, хотя бан-систему оставил на всякий случай.
Сергей Стоцкий @serjoga
карма
57,0
рейтинг 0,0
Tech Lead
Самое читаемое Администрирование

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

  • +25
    Гениально!
    • –13
      что гениального в простом добавлении поля в форме? :) автор нашел простой и удобный чит, вот и молодец )
      • +5
        Гениально своей простотой =)
    • +20
      Этому методу борьбы со спамом уже много лет. Можно сказать, точ прототип зародился еще до появления интернета. :)
      Если целенаправленно сайт не спамят, вполне защищают.
  • +3
    Задумка интересная. Будет работать до тех пор, пока кто-нибудь это не просечет и не настроит своих ботов специально для вас.
    • +3
      Мне кажеться, что если раз в неделю менять название поля, то устанут настраивать.
      • 0
        а вы название поля менять не устанете? :)
        • +6
          А кто-то заставляет делать это руками?
      • +1
        Можно сделать чтоб боты не заполняли скрытые поля.
        • +3
          Если скрывать JS'ом, то они это не просекут.
          • 0
            Да, вы правы. Я подумал про вариант с css
          • 0
            Боты давно выполняют и css и js ;)
            • +1
              Накрыть блоком с цветом фона. Глаз, надеюсь, у них еще нет?
              • 0
                Есть. И блок с цветом фона палится за 1.5 секунды.
                • 0
                  А блок с паддинг-марджин хайдом?
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • 0
                      Ну это да, тут уже костылять надо :(
      • +1
        У меня названия полей при каждой загрузке страницы меняются, но всё равно часть ботов пролазит, ибо они цепляются к настоящему браузеру и заполняют видимые поля. Притом что у меня ещё и js-защита стоит, а урл в форме комента фейковый. Лезут всё равно, суки.
  • +41
    Поздравляю, вы открыли Honeypot Captcha, в этой статье возрастом почти в 4 года, хорошо описывается как и что haacked.com/archive/2007/09/11/honeypot-captcha.aspx
    • 0
      Нет ли подобной штуки в виде плагина для Wordpress?
    • 0
      возможно, но на Хабре об этом не много информации =)
      • 0
        Кхм...
        Это наиболее содержательная статья из известных мне. Можно нагуглить и ещё парочку, если постараться.
  • +9
    Вроде это один из самых известных способов обмануть бота…
  • 0
    Экспериментировал подобным образом.

    Работает до поры до времени. Потом — все больше спама проходит. К сожалению. :(
    • +1
      эксперименты разгневали спамовых богов :)
  • 0
    Скоро боты выйдут из под контроля, начнут само обучаться и загадят все интернеты спамом ))
  • +1
    У MODX есть стандартное расширение для обратной связи FormIt с такой защитой. Давненько уже, кстати.
  • +2
    алЬОша???
    • +3
      Украинский вариант :)
      • 0
        точно -)
  • 0
    От ботов спасает, а от спамеров?)
    • 0
      а спамеров можно и забанить =)
      • –4
        Не проще премодерацию комментариев поставить?

        + Ко всему спасет от display: none, visibility: hidden, text-indent: -9999px :)
        • –7
          Минус за то, что вы тупорылые?!)
          • 0
            Сутки назад мы уже с тобой встречались и ты снова хамишь людям. Нравится оскорблять?
  • +3
    Методу сто лет в обед… Он даже используется в готовых движках из коробки, например в ShopCMS. Выше упоминали MODx
    • +1
      а я и не претендую на Нобелевскую премию =)
      • 0
        Нет, то, что вы придумали его сами — это достойно. Но вот оригинальности под катом не оказалось. Это прискорбно
  • +2
    Методу возможно и сто лет в обед, но если автор допер до него своим умом — то честь ему и хвала. Правда красивое и простое решение.
  • +8
    Ничего личного, но современный мир таков, что если между между «какая хорошая идея» и «я уверен, вы оцените оригинальность» открыть гугль, то можно увидеть, что особо никакой оригинальностью и не пахнет.

    Я похожую защиту использую уже несколько лет. Если интересно — выложу готовый код для wordpress.
    • +5
      понимаете… кто-то открывает гугль для решения проблемы, а кто-то напрягает мозги. 1-2 века назад математики изобретали одинаковые методы решения и ничего страшного =)

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

      P.S.: ничего личного, сам часто ищу решение в гугле
      • –6
        в данном случае вы изобрели изобретенный велосипед. причем сомнительного качества :)
      • +1
        У математиков была отмазка — отсутствие гугла.

        А у вас ее нет, к сожалению.
      • 0
        Вообще-то, напрягать мозги полезно, и потому, прежде чем писать про оригинальность стоит подумать и проверить, насколько это оригинальность.
        • 0
          Да Вы абсолютно правы. Но знаете… Статья вызвала очень много разных, эмоций и мнений. Суджу по тому, что моя карма еще ни разу так не прыгала то вверх, то вниз. Аналогично и с рейтингом статьи.

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

          Думаю статья все-таки имеет определенный процент полезности =)
          • 0
            Конечно имеет, а вот рейтинг и карма, как раз и скакали из-за способа подачи информации.
            • 0
              «Не результат, а путь главнее. Именно путь приносит радость» (из кин. Мирный Воин)
              • 0
                Ну как пример — разработчику может быть важнее путь, а вот заказчику результат. Хотя успеха достигает чаще тот, для кого именно результат важнее. Что, кстати, не мешает наслаждаться путём его достижения.
        • +3
          Меня все больше возмущает, что за интересные статьи или работы по тематике на современном хабре возникают претензии и недовольства к автору. Но зато на всякую хрень половина сообщества реагируют положительно…
          Автор молодец, умеет думать и рассуждать. Материал представлен на хорошем уровне. (Уж извините любители острых шуток и поедателей красивой «воды»). Текста не много и по делу. Успехов автору в других интересных открытиях ;)
          • 0
            Претензии не за статью, а за то, что автор подал материал всем так, как будто это изобретение, о котором вы не знали. А для многих это просто обыденность.
            • +1
              Спасибо за пояснение, я с ним согласен. Главное, чтобы про обыденность таких решений более опытные люди говорили не резко и не жестко. А то жалко, если у думающих людей будут отбивать интерес к обучению =)
              • 0
                Верно. Нужно чтобы радость открытий оставалась. Того, что ты сам придумал, а не подсмотрел.
    • +1
      Я похожую защиту использую уже несколько лет. Если интересно — выложу готовый код для wordpress.

      Выкладывайте.
      • –4
        А чего Вы так заинтересованы кодом? Алгоритм есть, реализуйте сами. Делается проще, чем капча. Да и к тому же, на своем велосипеде, пусть даже худшего качества, все равно легче кататься.
        • +1
          Автор предложил выложить сам, если кому интересно — я отозвался, ибо мне интересно.

          На своем велосипеде можно забыть прикрутить сидение и ходить с рваными штанами.
          • –3
            Так раз руки-крюки, запаситесь штанами :)
            • 0
              Или же попрошу того, у кого руки в плане кода прямее моих, выложить этот самый код.
      • 0
        Там ничего сложного нет, но это работает
        kartz.ru/2011/04/14/stop-spam-wp/

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

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

        Так что в этой области я ОДНОЗНАЧНО ОДОБРЯЮ ВЕЛОСИПЕДЫ. Хотя автор поста и не совсем оригинален — но свою задачу он успешно решил.
  • 0
    Т.е. капчу взломали дважды, и вы думаете что простейшее скрытое поле не взломают?
    • +1
      Разница в том, что ботоводам невыгодно настраивать свои программы под каждый сайт. А взламывать капчу — дело, поставленное на поток и усилий не отнимает.

      Я в свое время защитился от спама похожим способом — сделал флажок «Я не бот» в форме заполнения комментария.
      • –1
        Интересно, я думал капчи нужно ломать каждую индивидуально. Ну или китайцам отдавать, тогда тип капчи не влияет… :)

        И странно ещё что, действительно, этому способу уже много лет, ботописатели могли бы добавить распознавание медовых горшочков.
        • 0
          А как?

          Проверять поля формы на скрытость? Лично я делаю несколько таких полей со служебной инфой, и javascript при заполнении в некоторые поля кое-что пишет.
          Откуда боту знать, какое именно поле я буду проверять на заполненность?

          Метод простой и прикольный, но не новый.
          • 0
            Ну да, обычно же это секретное поле заворачивают во что-то вроде
            <div style="display: none;"><input name="haha_stupid_bot" /></div>
            Бот может смотреть если поле расположено внутри блока с определённым стилем. Уже один из вариантов honey pot боту не страшен.
            • 0
              Дык я и говорю, что надо делать 5 инпутов с type='hidden' и всех делов.

              Если заполняет человек, то 4 из них, нужных, заполнит javascript, а пятый — нет.
              А если бот — то либо заполнит все, либо ничего.

              Он же не знает, какое именно поле я проверю на заполненность? Тут можно много нафантазировать.
              • 0
                любой способ имеет как + так -. Например это можно обойти если написать бота на JS и заюзать броузер =)

                но обычно так не делают
              • 0
                Да, это уже улучшенный honeypot :) Я имел в виду научить бота бороться с самым простым скрытым полем — просто не заполнять скрытое поле.
                Если заполняет человек, то 4 из них, нужных, заполнит javascript, а пятый — нет.
                … если заполняет бот без js. Что-нибудь на основе селениума по-идее должно обходить такие защиты — такой бот будет выглядеть почти как человек.
            • 0
              вы сами придумали про заворачивание в скрытый див или подсказал кто-то?

              или input[type=hidden] {display:none;} в css кто-то отменил уже?
              • 0
                то есть [type=text]
                • 0
                  Не помню где, но скрытый блок я где-то подсмотртел, возможно в Django, она например таким образом помещает в форму токен для защиты от CSRF. Кажется это имеет смысл — определить что поле скрытое по его атрибуту style проще чем парсить все родительские блоки и смотреть их стили.
      • +1
        Думаю ваш следующий ход это сделать флажок скрытым.
  • 0
    Хорошая идея пришедшая в голову это круто. Но можно было погуглить да. Хотя лучше, наверное, самому додуматься. Греет лучше.)
  • –1
    я думаю, что этот способ, в моем случае, оказался лучше за капчу =)
    • 0
      Хабр глюканул… коммент попал не в то дерево (
  • –1
    можно еще сделать шаблоны инпута и рандомно вводить их в скрытые поля, это должно усложнить самообучаемость…
    • +2
      метод в посте ниже, про время в сессию, будет эффективнее
  • +2
    Года 2-3 назад подумывали над такими системами защит. По мимо этой ещё есть хороший вариант при генирации формы ставить тайм штамп в сессию, а при получении формы сравнивать его с временем отправленной формы. Шанс, что пользователь введет форму за 2-5 секунд ничтожно мала.

    П.с. Такой вариант стоит использовать без валидаторов на стороне сервера или же с дополнительными валидаторами на стороне браузера, что бы при повторной отправки формы с быстрым изменением ошибки в поле не перепутать юзера с ботом.
  • 0
    Ну, как вариант. Хотя спам-боты тоже не стоят на месте в развитии. У меня, например, это — один из десятка признаков на спам, и все равно периодически идет протечка: один-два из тысячи примерно.
  • 0
    А как же этот плагин, который реально постоянно подпиливается и даже от «человеческих комментариев» защищает? parasite-eliminator.ru/bloggers/magic/
    • +2
      Последняя версия 0.849 от 29.11.2008.
      Не похоже на «постоянно подпиливается».
  • 0
    лучше бы акисмет пользовали. Лучшая защита от ботов — краудсорсинг.
  • 0
    Вы открыли honeypot.
  • –1
    Я давным-давно добавил такое же скрытое поле, только назвал его «Url». Но зачем так палить контору и афишировать лишний раз этот метод? Чтобы авторы ботов приналегли на разработку обходных путей?
    • 0
      Почему вы считаете авторов ботов тупыми? Им известно об этом методе давно. Сейчас боты скачивают параллельно еще и js/css, отыскивая в них конструкции, связанные со всеми элементами атакуемых форм.
      • 0
        «Приналечь» — не значит открыть для себя этот метод. Это значит выделить на его обход больше ресурсов. Так что, пожалуйста, не приписывайте мне утверждений, которых я не делал, относительно их тупости.

        Я знаю, что боты пытаются парсить css и js.

        Но описанный метод до сих пор работает на всех моих сайтах, а значит, спамеры все еще недостаточно уделяют внимания этой области. И хочется, чтобы это продлилось как можно дольше.
  • –1
    А зачем вообще поле скрывать? Как говорили древние — лучший тайник это тот, что на виду. Достаточно оставить открытым, просто пометить его необязательным к заполнению — как обычно делают в формах, подсвечивая обязательные поля, или меняя цвет названия поля, и тп. Уверен, что никто из человеков не будет оставлять реальный телефон или париться чтобы ввести набор цифр в необязательное поле. А вот бот, как вы заметили, будет заполнять все.
    Профит — не надо бояться ботов наученных не реагировать на скрытые поля.
    • +1
      " Уверен, что никто из человеков не будет...", — как же завидую вашей уверенности!

      Я-то, в массовых проектах, всегда страдаю, пытаясь удовлетворить всю аудиторию, а не только те ~10%, о которых имею более-менее сносное представление.
      • –1
        Вообще-то интернет не вчера пришел в массы, и остальные 90% вашей аудитории совсем не гламурные секретарши готовые на всех подряд форумах оставлять свои телефоны/адреса/номера кредиток. Хотя было бы интересно провести эксперимент — на каком-то ресурсе проверить сколько пользователей все-таки оставят свои телефоны или другую личную информацию, не требующуюся для регистрации.
    • +1
      «Если есть люди, которые в солнечный день смотрят на людей в бейсболках, которые ганяют шарик по полю, то поверьте 100% найдутся люди, которые днями на пролет будут смотреть суицид по кабельному».
                                                                                                                   Джон Карлин
  • 0
    Есть способ проще. Боты обычно обращаются напрямую к файлу, содержащему форму комментариев, а пользователи обращаются к ней через страницу с постом. Запрет прямого обращения к файлу с формой такой же древний метод, как ваш.
  • 0
    Хехе, все гениальное просто :)

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