Form Spam Bot Blocker: Защищаем Web-формы без CAPTCHA!
- Вы так защитили свою форму что сами не всегда можете разобрать что нарисовала CAPTCHA?
- Вы установили хорошую CAPTCHA и все равно время от времени у себя в feedback-е читаете новости о удлинителях некоторых органов, дешёвой виагре и т.п.?
Я предполагаю, что вы уже знаете что такое 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.
Базовые идеи:
-
Пользователь (человек или робот) должен иметь такой же IP и такой же http user agent ID, как на странице с HTML-формой, так и на странице-обработчике по методу POST или GET. Пользователь всегда сначала посещает страницу с HTML-формой, потом переходит на страницу обработчик, роботы так делают не всегда, так как они часто только обращаются к целевой странице с обязательными параметрами. Другими словами: страница, содержащая html форму, должна быть загружена перед тем, как передать параметры целевой странице (странице, которая принимает параметры. IP и браузер потребителя должен быть одинаковыми на обеих страницах.
Spambot вынужден использовать такой же IP и агент ID, сканируя и нападая
-
На пользователя не будут воздействовать скрытые теги, имена которых, меняются ежедневно.
По сути дела, на пользователя они могли бы воздействовать, если бы, например, он зашол на страницу с формой в 23.57 а послал запрос в 0.06 (на следующий день), но есть простое решение этой проблемы. Еще одна ручная работа для робота использовать прескан (предварительное сканирование) html страницы, содержащей форму, и посылать запрос с просканированными параметрами. Ежедневное изменение скрытых имен параметров потребует от робота производить прескан html страницы перед нападением.
Spambot вынужден предварительно сканировать форму в день нападения
-
Форму нужно засабмитить в пределах определённого временного отрезка. Если время от загрузки формы до сабмита слишком мало или слишком большое то мы скорее всего имеем дело с роботом. Например, пользователь не может заполнить 6 полей менее чем за 2 секунды...
Spambot вынужден засабмитить форму в пределах определённого временного отрезка, сканируя и нападая
-
Spambot будет пробовать заполнить каждый элемент формы некоторым значением.
Это лучше всего гарантируют успешный сабмит. Если стандартный input тег размещён в форме и визуально скрыт от пользователя средствами CSS, пользователь ничего не введёт в это поле. Но весьма вероятно, что spambot это не "просечёт" и заполнит это поле.
Spambot вынужден идентифицировать элементы визуально скрытых форм ловушек и пренебречь ими, при нападении
Опыт использования Form Spam Bot Blocker
Несколько недель назад я поставил этот класс на достаточно посещаемый и нагруженый проект в моей организации. В день регистрируется более 1500-1700 "проваленых" попыток засабмитить форму ботом. При количестве легальных сабмитов около 1200-1400. Пока что процент спама достаточно низок (скорее всего не от ботов а от "тематических" спамеров), которые частично автоматизируют свой труд с помощью плагинов к браузеру.
Возможно, со временем и эту защиту будут "пробивать" многие боты. Но мне понравился подход, его можно модифицировать, доставить еще ловушек.
В очень ответственных формах можно комбинировать с CAPTCHA. Одно другому не мешает.
Как использовать этот клас
-
Создайте необходимые теги на сранице содержащей форму
- Опционально установите значения "по-умолчанию" в исходном коде класса (public variables)
- Включите класс в ваш скрипт
- Создайте объект: $blocker=new formSpamBotBlocker();
- Опционально выполните public-методы или установите public-переменные для адаптации переменных по-умолчанию к вашей web-форме
- Выведете в вшей 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 }
Скачать
Так как phpclasses требует регистрации перед тем как скачать, я выложил архив пакета у себя.
formSpamBotBlocker. Документация на русском - мой частичный перевод на русский документации к этому классу.



комментарии (116)