10 августа 2009 в 22:14

Интересный способ защиты от ботов

Наткнулся тут недавно на одном сайте на способ защиты от ботов без использования каптчи и javascript.
Все очень просто — достаточно добавить скрытое поле с символом кодированным в HTML сущность (например © — и т. д.). Дело в том что браузер найдя такой символ преобразует его перед отправкой в обычный, а робот использующий парсер форм так и отправить закодированным (причем у меня есть свой парсер форм и он сделал бы именно так). При проверки формы достаточно просто посмотреть длину строки в этом поле. Если отправлял человек то она будет равна числу символов в строке, а если нет значительно больше.
Так что такое решение пусть и не обеспечивает серьезной защиты но вполне может применяться в тех случаях если что то более сложное использовать нельзя.

P. S. пример
P. P. S. Оказывается у меня тут в черновиках статья лежит про методы защиты от ботов и их обходы, стоит дописать?
Евгений @MadJeck
карма
104,6
рейтинг 0,0
Самое читаемое Разработка

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

  • +7
    Когда я писал парсер, я страницу преобразовывал в XML и работал с ней через XPath.
    А вообще надо писать парсер на основе браузера и тогда на все пофиг будет.
    • 0
      selenium rc + phpunit например :) довольно интересный парсер выходит
      • 0
        Не тяжеловат будет? :)
        • +1
          тяжеловат, зато результат адекватный всегда и геморроя меньше. хотя тяжелость зависит от сервер, где это крутится :)
    • +2
      Я свой парсер писал во времена php 4 и тогда слова DOM не знал вовсе, думаю не у меня одного парсер на регулярках :)
    • 0
      Это будет работать, если веб-страница well-formed, т.е все тэги корректно вложены и правильно открыты/закрыты
  • 0
    я в своем парсере всегда делаю html_entity_decode :) т.к. часто встречаються нужные данные, которые в таком виде, не очень удобно читать.
  • +6
    Ну, если Ваш парсер такой… простой, то нет надо думать, что и остальные такие же. Понимать энтити — это базовое умение любого парсера, думаю, и спамерские это прекрасно умеют.

    Кстати, и remal выше совершенно прав насчёт использования готового браузерного движка.
    • +2
      Если так думать то любая защита примитивна, да можно обойти любую защиту (благо имею опыт в этом деле). Но в некоторых случаях лучше поставить защиту «от дурака» чем нервировать пользователя. А этот вариант мне кажется достаточно красивым.
    • +1
      Спамят обычно всякие школьники, поэтому парзеры у них соответствующие.
      • 0
        Откуда такая статистика?
        • 0
          Кто еще будет спамить ссылками, скрытыми в <div style=«display: hidden;» >? Ясно же, что поисковики такое сразу определяют. А спамят и очень много.
          • 0
            поисковики определяют что?
            • +1
              Школьники спамят чем?
              • 0
                причем тут чем спамят?
                я про «поисковики такое сразу определяют». какое такое? О_о
  • 0
    blgo.ru/blog/2009/06/05/antispam/ — здесь несколько подобных примочек описаны.
    • НЛО прилетело и опубликовало эту надпись здесь
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      хороший способ… возьму на заметку, буду пользовать в комплексе со способом топика.
    • +6
      А потом без яваскрипта ваш сайт не отображается вовсе. Клево. Шикарно.
      • +2
        Зачем так категорично? Нет яваскрипта будте добры, проходите тест Тьюринга.
        • –1
          Да но откуда возьмется сама форма, если она в JS-файле?
          • +1
            Ну после капчи её можно показать и в HTML :)
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              За хамство не сочту, но к чему вы привели этот код я не понял. Он будет работать при выключенном JS?
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Я спросил откуда возьмется форма если отключен JS, а сама она в JS-файле лежит, по-моему по контексту ветки это должно быть понятно.

                  Меня не смущает ничего, из того, как работают (или не работают) стартапы. Корпоративный сайт обязан поддерживать функциональность по максимуму, и с отключенным JS тоже.
                  • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Это не показатель качества проектов. Это показатель количества мудаков.
          • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      минус — не получиться Unobtrusive Javascript
  • +2
    Интересный, а главное простой способ. К сожалению, как и многое другое, он будет служить очень короткий срок.
  • 0
    Помойму — гораздо проще добавить в поле скрытое средствами CSS поле, с именем, например «message». В принимающем скрипте проверять — если поле пустое — всё нормально, если заполнено (а бот заполнит обязательно), то блокировать такое сообщение. Делов-то.
    • 0
      Почему это бот обязательно заполнит? :) Чуть более продвинутый бот проверит все CSS-наследования и запросто поймёт, что туда писать не надо. С другой стороны — против лома нет приёма :)
      • +3
        как показывает мой личный опыт, скрытое через css поле «company» заполняют порядка 95% ботов. 90% из них пишут в него «google» (за что гуглу большое спасибо). до того, как я вставил это поле, мои хитрые алгоритмы отсеивали около 70% ботов. теперь ровно 100%.
        • 0
          Даный метод называется Honey Pots, сам им пользуюсь, спратать даные поля можно и с помощью javascript.
        • 0
          +1 но для полной гарантии имеет смысл добавить ещё пару популярных полей, вроде «name», «surname», «age»…
          и включить проверку ПО ВРЕМЕНИ:
          боты любят запоминать состояние hidden'ов чтобы форма точно дошла до получателя, если мы передадим в hidden текущую дату и время, а потом при отправки письма сравнивать это значение с текущим временем. Ведь только бот сможет отправить форму меньше чем за 3 секунды и только бот сможет «отправлять» форму более 12 часов =)
          • +3
            и только человек может в той же опере нажать Ctrl+Enter и написать «Пацталом!» или «зачОт!» в течении пары секунд…
      • 0
        Потому что нет таких умных ботов, чтобы CSS парсили.
        • 0
          всего лишь дело времени.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    >>P. P. S. Оказывается у меня тут в черновиках статья лежит про методы защиты от ботов и их обходы, стоит дописать?

    Ну если уже на то пошло, так пишите.
  • –3
    самая надежная защита — это не пущать никого. Ну или ограничивать количество сообщений и т.п. по ip.
    А если нельзя не пущать. То можно максимально усложнить труд спамо-программистов используя динамическое создание форм в DOM и сложное взаимодействие элементов DOM. В этом случае придется делать бота используя браузерный движок, что сложнее. А вот если для браузеров без яваскрипта писать отдельные формы с капчами, то это по-моему лишнее. Качпа она 3 копейки стоит за штуку.
    Хотя любая защита — это хорошо. Если она заставит потратить пару дней на написание отдельного бота для этого сайта — это уже уберёт большую часть спама. А если сайт не сильно посещаемый, то мало кто будет допиливать бота конкретно под ваш сайт.
    • 0
      ограничение количества сообщений не спасает от ботов, а только уменьшает количество сообщений от них

      «придется делать бота используя браузерный движок» — не придется, они давно есть

      отдельный бот отдельно банится на раз, за редкими исключениями. только сначала еще надо такой сайт сделать, чтобы под него отдельного бота стали писать…
      • 0
        В самом начале промелькнула ссылка на seleniumhq.org/projects/remote-control/ еще аналоги есть?
        • 0
          я занимаюсь защитой от ботов, а не их написанием :)

          то, что боты замечательно работают с javascript я уже давно выяснил на собственном опыте :(
          • 0
            Ну что бы написать хорошую защиту надо смотреть со стороны. Вот например вы использовали защиту на javascript, все красиво, работает, но к примеру я буду видеть что вот тут у вас функция дешифровки скрытого поля на XOR шифровании и мне ничего не стоит её реализовать вместо того что бы использовать полноценный парсер javascript. Тут надо учитывать что сложность защиты != ее стойкости.
            • 0
              защитой от ботов я занимаюсь вынужденно. т.е. вот, привалило всякой фигни, смотрим что бы с ней сделать. сначала спам в мыло, потом в формы. ну и так потиху избавился от всего этого. благо сайт не тот, под который кто-то стал бы персонально писать бота.
              • 0
                Ну это не так плохо как кажется, скорее всего работают комбайны типа хрумера, так что достаточно будет поля назвать по другому (не url а iddqd например).
                • 0
                  тот же хрумер обучается.
        • 0
          хотя можно и для тестирования юзать, а не только для гадостей. гугл сходу подсказывает simile.mit.edu/wiki/Crowbar и wtr.rubyforge.org/
          • +1
            Да уж конечно не только для гадостей много для чего. Мне например просто автоматизировать действия удобно некоторые, например хочу оплату через PayPal автоматизировать.
    • 0
      Бот с браузерным движком — не самая большая проблема, особенно в винде. IE замечательно подтается автоматизации через интерфейсы. Работать будет не сильно быстро, зато таких ботов может клепать пачками любой быдлокодер.
      • –1
        Не сильно быстро? Быдлокодер? Ох как словами бросаетесь :))
        • 0
          Я говорю то, что есть, ибо по долгу службы пришлось однажды заниматься автоматизацией IE, дабы не заниматься написанием собствненого парсера и JS-движка.
          • 0
            Собственный JS движок это крутовато, конечно. Я занимаюсь подобными задачами постоянно, в рамках разработок клиентов, не все так прозрачно.
            • 0
              Не сложнее, чем любая другая автоматизация.
              • 0
                Вы о готовых решениях, или самописных? Нет, любая задача решаема, конечно, но портировать весь JS дорогого стоит.
                • 0
                  Я об автоматизации IE.

                  У него внутри все есть.
                  • 0
                    Да, но он очень медленный как мне показалось и довольно глючный, допускаю что плохо разобрался, но сходу заставить COM объект правильно работать у меня не получилось.
                    • 0
                      Он не глючный, он спецефичный.

                      Он работает со скоростью браузера (то есть в разы медленнее парсера), но умеет все то же самое, что умеет браузер, и любая защита, настроенная на скрытые поля и прочие вещи, которые, теоретически, парсер не умеет, обходится им на раз.
                      • 0
                        Да я согласен, просто у меня не получилось обойти flash защиту с его помощью, хотя в самом IE все работало.
                    • 0
                      Медленный? Честно скажу, пробовал Mozilla движок, раз в десять медленнее для анализа данных получалось (правда это было года два назад, все могло измениться). Правильная работа дело рук программиста:)
  • –1
    теперь все, у кого это не было реализовано, — реализуют.
    • 0
      и боты начнут и их парсить…
  • 0
    С первого раза не понял, но дочитывая комменты весь прикол в том, чтоб вставлять xml entities.
    Я не думаю, что роботы настолько наивны не понимать их.
  • 0
    Но дело в том что если какой нибудь злостный хаккер захочет написать вам стопицот комментариев скажем, он это сделает, ибо POST запрос будет сформирован в соотвествии с вашим требованием, только сложно было бы понять в чём дело, но теперь думаю это уже известный метод.
    А от штатных ботов, думаю защитит.
  • 0
    Автор думает, что открыл Америку? Это же самая старая и простая каптча. Хотя так скорее вы выполняете проверку не человек/компьютер, а браузер/парсер.
  • 0
    как по мне, самая нормальная каптча — это recaptcha ;) поставил — не одного бота, комментария и т.д. пользователи особо не жалуются на нее…
  • 0
    Способ действительно хороший. Очевидный и простой. От штатных ботов защитит, да. Ну, а с более продвинутыми стоит, ИМХО, разбираться в индивидуальном порядке: универсальной защиты от всего все равно не бывает (а как хотелось бы! :) )
  • 0
    Насколько я проверил в Firefox 20 и Chrome 26 под Ubuntu — обещанную конвертацию браузеры не делают.
    На входе в форме имею:
    <input id="search_char" name="search[char]" value="&ordm;" type="hidden">
    При передаче контроллеру в логах получается:
    Started POST "/ru/searches" for 127.0.0.1 at 2013-06-28 08:54:23 +0300 Processing by SearchesController#create as HTML Parameters: {"utf8"=>"✓", "search"=>{"query"=>"bla-bla-bla", "char"=>"&ordm;"}}
    Потратил на внедрение этого псевдоспособа 40 минут, надеюсь, этот пост кому-то сэкономит время. Либо я узнаю в чем ошибся :)

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