Разработка → Form Spam Bot Blocker: Защищаем Web-формы без CAPTCHA!

apelsyn 22 июня 2008 в 00:53 4,7k


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


Ну тогда предлагаю под другим углом взглянуть на проблему защиты Web-форм.


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


Недавно я качал файл с rapidshare.com, там нужно указать буквы на которые прицеплен кот.

(правильный ответ 'X6VK').


Так вот, ни с первого ни со второго раза я капчу «не распознал». Неужели нету другого способа идентифицировать реального пользователя? Вероятно, он есть, но ведь rapidshare борется не с ботами а с хакерами, которые целенаправленно «пробивают» RapidShare.


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


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


Миф о «непробиваемости» CAPTCHA


Проблемы взлома CAPTCHA хорошо описал Владислав Мысла. Я советую скептикам прочитать этот топик. Ниже я кратко перечислю основные акценты статьи.


Нету смысла останавливаться на программных уязвимостях при реализации CAPTCHA, когда разработчик забывает о том, что


  • время существования сессии должно быть ограничено
  • после получения формы, сессия должна быть немедленно удалена
  • надо проверяйть полученные данные на пустые значения



Основной способ обойти CAPTCHA — это ее распознать. На сегодняшний день уже существует много проектов, занимающихся исключительно распознаванием CAPTCHA. Наиболее известными из них являются два: “UC Berkeley Computer Vision Group” и “PWNtcha”. Степень успешного распознавания у обоих проектов достаточно высока (список CAPTCHA, который уже сейчас научились распознавать).


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


На чем можно «подловить» Spam Bot


Год назад, копаясь в phpclasses.org, я наткнулся на довольно оригинальное решение на PHP, которое называется Form Spam Bot Blocker. Разработчик этого php-класса пошёл другим путём, его подход не требует никакого дополнительного ввода данных пользователем.


Эта методика базируется на том, как ведёт себя пользователь, а не на том, что он вводит. Класс создаёт /> теги с зашифрованными значениями или визуально скрывает поля (средствами CSS), которые видит СПАМ-бот. Комбинация нескольких методов может действительно свести с толку СПАМ-бот, даже если он только-что прочитал html код. Надо отметить, что никакие Capthca-, Session-, Cookie — или Javascript-основанные методы здесь не используются. Только чистый (x)html и маленькая вставка CCS.


Базовые идеи:


  1. Пользователь (человек или робот) должен иметь такой же IP и такой же http user agent ID, как на странице с HTML-формой, так и на странице-обработчике по методу POST или GET. Пользователь всегда сначала посещает страницу с HTML-формой, потом переходит на страницу обработчик, роботы так делают не всегда, так как они часто только обращаются к целевой странице с обязательными параметрами. Другими словами: страница, содержащая html форму, должна быть загружена перед тем, как передать параметры целевой странице (странице, которая принимает параметры. IP и браузер потребителя должен быть одинаковыми на обеих страницах.
    Spambot вынужден использовать такой же IP и агент ID, сканируя и нападая
     
  2. На пользователя не будут воздействовать скрытые теги, имена которых, меняются ежедневно.
    По сути дела, на пользователя они могли бы воздействовать, если бы, например, он зашол на страницу с формой в 23.57 а послал запрос в 0.06 (на следующий день), но есть простое решение этой проблемы. Еще одна ручная работа для робота использовать прескан (предварительное сканирование) html страницы, содержащей форму, и посылать запрос с просканированными параметрами. Ежедневное изменение скрытых имен параметров потребует от робота производить прескан html страницы перед нападением.
    Spambot вынужден предварительно сканировать форму в день нападения
     
  3. Форму нужно засабмитить в пределах определённого временного отрезка. Если время от загрузки формы до сабмита слишком мало или слишком большое то мы скорее всего имеем дело с роботом. Например, пользователь не может заполнить 6 полей менее чем за 2 секунды...
    Spambot вынужден засабмитить форму в пределах определённого временного отрезка,
    сканируя и нападая

     
  4. Spambot будет пробовать заполнить каждый элемент формы некоторым значением.
    Это лучше всего гарантируют успешный сабмит. Если стандартный input тег размещён в форме и визуально скрыт от пользователя средствами CSS, пользователь ничего не введёт в это поле. Но весьма вероятно, что spambot это не «просечёт» и заполнит это поле.
    Spambot вынужден идентифицировать элементы визуально скрытых форм ловушек и пренебречь ими, при нападении
     


Опыт использования Form Spam Bot Blocker



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


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


В очень ответственных формах можно комбинировать с CAPTCHA. Одно другому не мешает.


Как использовать этот клас


  1. Создайте необходимые теги на сранице содержащей форму
    1. Опционально установите значения «по-умолчанию» в исходном коде класса (public variables)
    2. Включите класс в ваш скрипт
    3. Создайте объект: $blocker=new formSpamBotBlocker();
    4. Опционально выполните public-методы или установите public-переменные для адаптации переменных по-умолчанию к вашей web-форме
    5. Выведете в вшей html-форме: print $blocker->makeTags();


    Проверте $_POST или $_GET массивы на предмет того, содержат ли они
    действительные (valid) параметры из html-формы
    if ($_POST){ // or $_GET
    	$blocker=new formSpamBotBlocker();
    	$nospam=false;
    	$nospam=$blocker->checkTags($_POST); // or $_GET
    		if ($nospam) print "Успешный sabmit"; // handle valid request
    		else print "Есть подозрение что это СПАМ-бот"; // handle invalid request
    } 
    


Проголосовать:
+86
Сохранить: