Защита ваших Web-форм от СПАМ-ботов (formSpamBotBlocker).
О программе
Большинство из web-мастеров знает проблему авто-сабмита форм СПАМ-ботами (spambots)
слишком хорошо! Есть несколько решений этой проблемы, одно из самых лучших
использование CAPTCHA. К сожалению решения такие CAPTCHA требуют от человека
дополнительно что-либо вводить и из-за этого страдает так называемая 'accessibility'.
Разработчик этого php-класса пошел другим путем, это не требует никакого дополнительного
ввода данных пользователем. Эта методика базируется на том, как ведет себя пользователь,
а не на том, что он вводит.
Класс создает <input type="hidden" /> теги с зашифрованными значениями или визуально скрывает
поля (средствами 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 вынужден идентифицировать элементы визуально скрытых форм ловушек и пренебречь ими, при нападении
Реализация упомянутых выше идей
-
[userID] A <input type="hidden"> tag, generated dynamically, has name and value attributes depending on the current user IP and browser ID. The name and value are encrypted and their length can be easily changed. This input tag will be checked on the target page for validity. Of cource, these are static values for an unique IP and browser -> Robots would still have to use the same IP and browser ID, when scanning and calling a form, to simulate a human user. Many spambots cannot do that though...
-
[dynID] Partial static values are not enough, we need some dynamically changing name/value to prevent automatic form submissions. Another <input type="hidden"> tag must be generated dynamically. This tag has an encrypted name attribute, depending on the current date. This daily changing name prevents prescanning older than the current day. To avoid the midnight problem, mentioned above, a class variable $minutesAfterMidnight has been added. It sets the minutes after midnight to still allow the submission of a form generated at the previous day.
-
To set a time window for a form to be submitted, the class uses 2 variables $minTime and $maxTime. When a form is generated the current time will be encoded and set as value of the previous dynID input tag. On the target page, this time value will be compared using the variables $minTime and $maxTime.
-
[trapID] A standard <input type="text"> tag with a tempting name will be generated. This element will be visually hidden from a human user with CSS. However, if CSS is disabled, the input will still be displayed. For this reason, an explanatory label is provided that informs the user to not enter anything into the trap tag. A spambot, that has scanned the web form, will probably submit the form with some value in the trap tag. The class checks is there is a value and identifies the spambot (or a human user, who has disabled CSS and has ignored the label instructions). This method can be disabled by function setTrap().
The generated <input type="hidden"> tags contain encoded names and values. To make it even more difficult for a spambot to guess the encoded names and values of the <input type="hidden"> tags, the class uses an encryption method based on a unique key passed though the form. These names and values (and the key) change dynamically each time a form is loaded. You can even make the names and values almost impossible to guess (even if the spambot knows the source code of the class) by setting your own unique string as the value of the public variable $initKey.
Может spambots все еще успешно засабмитить html-форму, защищенную этим классом?
Можно в настоящее время предполагать о 2 методах, как можно успешно засабмитить html-форму,
защищённую этим классом:
-
Если spambot (точнее - разработчик) знает исходный код класса и уникальне значения $initKey,
которое установлено "по-умолчанию". Скрипт мог бы динамически сгенерить все,
требуемое параметры и передать их в целевой url. Однако если значение класса $initKey "по-умолчанию"
будет изменено и не будет известно spambot-у чтобы кодировать/расшифровать параметры,
внешний сценарий не сможет принести никакой пользы...
-
Если spambot может симулировать человеческое поведение действительно хорошо.
Чтоб получить результат, bot должен загрузить веб-форму, просканировать ее и обратиться к целефому скрипту
используя тот же самый IP/agent ID (все действия произвести в пределах определённого временного отрезка)
Кроме того bot должен быть в состоянии идентифицировать западню <input type="text">, анализируя CSS
и оставить это поле пустым.
Как использовать этот клас
-
Создайте необходимые <input> теги на сранице содержащей форму
a. Опционально установите значения "по-умолчанию" в исходном коде класса (public variables)
b. Включите класс в ваш скрипт
c. Создайте объект: $blocker=new formSpamBotBlocker();
d. Опционально выполните public-методы или установите public-переменные
для адаптации переменных по-умолчанию к вашей web-форме
e. Выведете в вшей 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
}
Скачать formSpamBotBlocker
Автором этого класса является Giorgos Tsiledakis <gt(at)corissia(dot)com>. Я только перевел часть текстов на русский.
C уважением, Олег Черний (oleg точка cherniy собака gmail точка com)
ICQ: 65632796