Еще один способ защиты веб-форм от роботов

    Предисловие


    Выношу на суд читателей хабры свой способ защиты форм от спам-ботов. Способ базируется на том, что большинство ботов не умеют читать таблицы стилей и выполнять коды javascript. Зато около 90% всех браузеров поддерживают эти технологии. Остальные 10% — это старые браузеры и браузеры с отключенным javascript. Если вдуматься, то навряд ли пользователи этих 10% имеют своей целью пользоваться формами обратной связи, регистрации на форумах, гостевых и пр. Сейчас вкратце рассмотрю способы борьбы с таким спамом на сегодняшний день.

    Существующие способы борьбы и их минусы


    Способы:


    • Использование CAPTCHA
    • Комбинирование перечисленных способов

    Минусы:


    К минусам можем отнести раздражение пользователя, которого заставляют решать головоломки, угадывать числа, буквы. Дальше, большинство сегодняшних графических капчей являются так называемыми «слабыми капчами» и взламываются с помощью нехитрых серверных скриптов OCR. Здесь также стоит упомянуть «метод леммингов», где в процессе распознавания капчи принимают участие множество настоящих людей: спамеры переразмещают вопрос/картинку со взламываемого сайта на специальных сайтах с высокой посещаемостью, где, чтобы получить доступ к информации человек разгадывает таку капчу и передает результат спамерам. Еще метод поинтересней — прямой наем людей для отгадывания.

    Суть моего способа



    На странице создаем фиктивную форму и прячем ее поля от глаз пользователя, используя элемент таблицы стилей display:none. Далее, запустив на странице определенную javascript-функцию где-то за пределами фиктивной формы, выводим вместо нее настоящую с действительными названиями полей. При отправке роботом фиктивной формы, интерпретатор получает массив с неверными названиями и, например, выводит сообщение об ошибке. В случае же с реальным пользователем, форма обрабатывается нормально.

    Преимущества:


    • 95% гарантия отсечения спам-бота
    • отсутствие нужды для человека разгадывать captcha
    • простота реализации для разработчика
    • нагрузка на спамерский сервер из-за потребности выполнять javascript и css


    Минусы:


    • Рано или поздно взломают


    Реализация


    Основная часть работы выполняется на стороне клиента с помощью CSS и Javascript. С
    помощью CSS, который желательно подключать к странице из отдельного файла, прячем
    форму-ловушку от глаз пользователя:


    #ourGreatForm {display:none;}


    Дальше пишем простой javascript (кстати, тоже можно вынести в отдельный файл), со следующим содержанием:
    function GenerateSomethingGreatForRealPeople() {
    
    // Объявляем о нашей переменной
    var ourfields =		'<input type="text" name="sndr_name"><br>'+
    		'<input type="text" name="sndr_email"><br>'+
    		'<textarea name="sndr_content"></textarea><br>'+
    		'<input type="submit" name="sndr_pressed_button" value="Отправить письмо">';
    
    // Заменяем подставные поля на тех машинах, где выполняется Javascript
    document.getElementById("ourGreatForm").innerHTML=ourfields;
    
    // Включаем отображение реальных полей
    document.getElementById("ourGreatForm").style.display="block";
    
    }
    


    Все элементы формы-ловушки помещаем между тегами . Значение идентификатора должно совпадать со значением внутри описанной выше javascript-функции:

    <!-- Это форма ловушка -->
    <form method="post">
    	<div id="ourGreatForm">
    		<input type="text" name="name" value="фиктивное поле" ><br>
    		<input type="text" name="email" value="фиктивное поле" ><br>
    		<textarea name="content">фиктивное поле</textarea>
    	</div>
    </form>
    


    После формы, где-то в конце документа запускаем нашу javascript-функцию, если перед нами настоящий браузер:
    GenerateSomethingGreatForRealPeople()
    

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

    Пример


    Страница в действии

    Выводы


    Способ зарекомендовал себя, как отличное оружие против спама, сведя его практически на нет на тех сайтах, где было осуществлено его внедрение. Целевая аудитория пользователей способа — сайты с небольшим траффиком. Такая защита действенна против ботов, размещенных в основном на хостинг-серверах общего пользования, не умеющих работать с javascript и css. Через некоторое время, я уверен, спамеры напишут программулину для обхода и этого способа, но только в том случае, если использование этого способа станет массовым. Для усиления защиты от спам-ботов можно считать комбинирование моего метода с captcha-ей — человеческим вопросом.

    Ссылки по теме:


    1. Wikipedia: Глобальная рыночная доля использования браузеров. Подсчет не по-русски.
    2. Spylog: Глобальная рыночная доля использования браузеров. Подсчет по-русски.
    3. Один из алгоритмов взлома графической captcha
    4. Wikipedia: Все о captcha



    Любые комментарии, дополнения, замечания приветствуются.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 22
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Конечно, если бы вы были роботом с отключенным Javascript и CSS, то увидели бы три поля со значениями "фиктивное поле" внутри. Но вы ведь не робот? :)
      • 0
        Какой-то замудрённый способ, а от способа "Скрыть поле средствами CSS, которое пользователь не заполнит, а бот заполнит и выдаст себя" - ничем не лучше.
        • 0
          Если количество полей невелико, бот сможет пытаться каждый раз заполнять разные поля, присутствующие в форме, тем самым существенно повышая вероятность удачной отправки спама. Пройденный этап.
          • 0
            Это если бот не случайно зашел на сайт, а был специально под него заточен, иначе вариантов слишком много.

            А если бот был специально заточен под определённую защиту - Ваш способ тоже ничем не поможет.
        • 0
          Роботы, посылающие просто запрос на сервер по данным из распарсенной страницы почти не используются и в скором времени себя совсем изживут. JS понимают почти все. Поэтому JS-подделки уже совершенно не являются защитой. Под такой способ даже перенастраивать ботов не надо, никто и не заметит вашей "хитрости". Форма как форма, заполнят и заспамят:)
          • 0
            совершенно неясно зачем столько сложностей
            на том что боты не умеют читать js можно сделать совершенно простую штуку - по сабмиту добавлять к форме какой-нибудь параметр с помощью js, типовые боты это не тоже раскопают, а от человека который целенаправлено спамит ваш сайт этот способ ничем не хуже. т.е. бесполезен абсолютно: спаммер просто смотрит что посылается на сервер после сабмита и посылает то-же самое.

            все эти способы, основанные на js и мысли о том что браузер понимает больше робота - они полезны только от типовых ботов, которые сканируют формы. напридумывать разных извращений с js всегда можно (например недавно предлагали перетаскивать заполненную форму), но все эти методы, разные по сложности и размеру текста, необходимого для описания, абсолютно одинаковы в плане полезности
            • 0
              Собственно, я и говорю о типовых роботах. Ботам, которые спамят yahoo, facebook обычные формы обычных сайтов просто ненужны. Не тот масштаб.
              • 0
                правильно. я просто говорю о том что для типовых ботов можно сделать что-нибудь гораздо проще основываясь на том-же тезисе, что JS роботы не читают буквально в 2 строки можно добавить параметр который типовой бот не сможет добавить, результат будет такой-же, кода (соответственно работы, ошибок и т.д.) - меньше.
            • 0
              Любую абсолютно форму, хоть фиктивную, хоть какую, можно автоматом заполнить, и при первом просмотре страницы человек сразу поймет как. Вопрос в том, что боты рассчитаны на знакомые им формы, т.е. спамят на массово используемых движках (типа phpbb). Сделать форму "нестандартной" можно совершенно разными способами, и бот не поймет, что с ней делать. А вот если захотели проспамить конкретно твой сайт, какой бы оригинальной форма не была, они это сделают. поможет только картинка.
              И потом автозаполнение в предлагаемом варианте работать не будет наверняка.
              • 0
                какой умный ;) сам-то придумал? )))
                как минимум полгода назад этот способ уже озвучивали и неоднократно. даже здесь ;)

                так что не надо писать "Суть моего способа", автор.
                • –1
                  Сам придумал. Да :)
                    • 0
                      Идея скрывать поля силами css мне пришла в голову еще в конце 2006 года. Желание и решение оформить идею в виде статьи мне пришло пару дней назад. А вообще хорошие идеи приходят в голову многим людям одновременно.
                      • 0
                        Кто первый озвучил, тому и все лавры
                      • 0
                        Вот идея с хидден полем действительно хорошая. Пускай даже хидден стилем - робот вряд ли разберется)
                    • 0
                      Способ мало эффективен просто в силу того, что вся работа спамера - изменить названия отсылаемых переменных. Всё.

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

                      Однако, против специально нацеленных на данный сайт ботов это не поможет.

                      А техника, о которой вы говорите, называется honeypot captcha. Ned Batchelder написал отличную статью на эту тему. Причём его защита значительно эффективнее, т.к. использует помимо непосредственно honeypot обфусицированные названия полей формы и кучу дрегих приятных мелочей.
                      • 0
                        Вы не правы. Спамеру тогда придется вручную высматривать реальные поля для тысячи сайтов, каждый из которых по своему мог назвать эти поля. Плюс на каждом сайте могут быть какие-то свои поля, дополняющие имя, емейл и текстареа. Способ неэффективен, когда идет обстрел конкретного сайта.
                        • 0
                          Кажется я сказал ровно то же самое, причём предложил вариант, абсолютно не использующий никаких css или js и не менее эффективный (с подменой названий). Для достижения заданной цели все выкрутасы с js и css на самом деле не нужны.

                          Причём, уже существуют системы, которые анализируют страницы с помощью движков браузеров, а уже по ним составляют схемы атаки. И в данной ситуации предложенный мной вариант эффективнее, т.к. там не достаточно просто обработать css и js. Для успешной атаки живому человеку нужно проанализировать форму.
                      • 0
                        Поскольку все эти боты, как правило, ориентируются на "неизменяемость имен полей формы" можно делать следущее:
                        - добавлять к полям формы суффиксы, например первые 5 символов md5() время на сервере округленное до дня + salt и на сервере проверять. В результате, каждый день имена полей будут меняться.
                        - Генерить hidden поле с хешем, составленным из IP адрес + время на сервере округленное до часа (можно больше, смотря где ставить) + salt. Проверять всё на сервере. Кстати, во многих случаях будет достаточно одного только IP адреса :) Ботики явно обновляют свои данные гораздо реже, чем меняются их IPы.
                        • 0
                          Поставил такую штучку на PHPBB, отлично - тишина полная!!!-))
                          Спасибо автору!!!
                          • 0
                            Рад, что пригодилось )

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