DANFA

Защита сайта от Спам ботов

Я уже писал о вариантах защиты от Спам ботов в теме: Борьба со спамов в PHPFOX 3, но в той теме инструкции написаны для движка phpFox 3, которым пользуются далеко не все, более того многие про него ни чего не слышали. В этой теме я хочу поговорить о варианте защиты от спама не для конкретного движка, а о варианте, который бы подошел для любого сайта, от самопального проекта, написанного за двадцать минут, до популярного движка, который постоянно обновляется уже несколько лет.

Данную идею я подглядел в моде АнтиБот +100500 для движка форума phpBB 3.0.x, который был написан госпожой Некстати. По моему мнению - это лучшая защита от Спам ботов. Реализация защиты очень проста, достаточно внести пару правок в код своего сайта. Наша защита будет работать на PHP, JavaScript и конечно же добавим пару строк HTML кода в форму, например, в форму регистрации. Да, именно туда и добавим, ведь с нее боты начинают свои злодеяния на сайте.

Начнем с формы. В форму нам необходимо добавить всего одно поле, которое будет скрыто от глаз человека, но при этом боты его будут видеть. Код самого поля вставлять между тегами <form> и </form>:
<input type="hidden" id="token" name:"token" value="">

Далее на этой же странице, в самом низу, пишем JS код:
<script type="text/javascript">
// <![CDATA[
	var token = document.getElementById('token');
	token.value = 'tokenCode';
// ]]>
</script>

Вместо tokenCode будем использовать случайно сгенерированный код. Его сгенерировать можно на PHP, например, так:
$tokenCode = md5(session_id());

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

Теперь собственно проверяем полученные данные с формы регистрации. Если форму заполнял человек, то значение поля "token" должно быть сгенерированной строкой, если форму заполнял бот, то значение будет другим, возможно он это поле вообще не тронет, это не важно. Сравниваем полученные данные (PHP):
if ($_POST['token'] != $tokenCode)
{
	exit;
}

Тут так: если сгенерированный код не совпадает со значением, что пришло с поля "token", то работа сценария останавливается и регистрация невозможна.