14 ноября 2007 в 13:01

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

Предисловие


Выношу на суд читателей хабры свой способ защиты форм от спам-ботов. Способ базируется на том, что большинство ботов не умеют читать таблицы стилей и выполнять коды 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



Любые комментарии, дополнения, замечания приветствуются.
ukraine @ukraine
карма
8,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (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
      Рад, что пригодилось )

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

Интересные публикации