![](https://habrastorage.org/getpro/habr/post_images/25b/90b/8b4/25b90b8b47cdd5ea8018121556a18cb8.jpg)
- Вы так защитили свою форму что сами не всегда можете разобрать что нарисовала CAPTCHA?
- Вы установили хорошую CAPTCHA и все равно время от времени у себя в feedback-е читаете новости
о удлинителях некоторых органов, дешёвой виагре и т.п.?
Ну тогда предлагаю под другим углом взглянуть на проблему защиты Web-форм.
Я предполагаю, что вы уже знаете что такое CAPTCHA, возможно, многие из Вас использует эту технологию в своих проектах.
Недавно я качал файл с rapidshare.com, там нужно указать буквы на которые прицеплен кот.
![](https://habrastorage.org/getpro/habr/post_images/113/965/e92/113965e92762e7873c34a8548c8f3d22.jpg)
(правильный ответ '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 }