Защита от спама на PHP

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

Антиспам без Captcha

Защита от ботов основана на предположении, что любой бот заполняет все поля значениями. Получается, что если поле имеет атрибут, который скрывает поле от посетителя, последний не видит это поле и потому не заполняет его, тогда как бот считывает код страницы и пытается заполнить все поля формы.

Итак, наша форма:

<form action="/register.php" method="post">
  <input type="text" name="login" value="">
  <input type="text" name="e-mail" value="">
  <input type="password" name="pass" value="">
  <input type="submit" value="Отправить">
</form>

Необходимо добавить в нее скрытое поле:

<form action="/register.php" method="post">
  <input type="text" name="login" value="">
  <input type="text" name="e-mail" value="">
  <input type="password" name="pass" value="">
  <input type="text" name="invisible" id="invisible" value="">
  <input type="submit" value="Отправить">
</form>

А также в файле .css дописать код:

#invisible {
  display: none;
}

И, наконец, добавить в скрипт, которым обрабатывается форма, строки:

// Если скрытое поле заполнено
if ($_POST['invisible']!=''){
  die('Ботам - нет!');
}
else{
  // Обработка формы
}

Антиспам с использованием JavaScript (вопрос - ответ)

В обработчике формы создаем массив с вопросами и вариантами ответа на них и перемешиваем элементы массива:

<?php
$spam[] = array("Три плюс пять равно...","v.match(/^восемь$/i)||v=='8'");
$spam[] = array("Шесть минус два равно...","v.match(/^четыре$/i)||v=='4'");
$spam[] = array("Девять минус девять равно...","v.match(/^ноль$|^нуль$/i)||v=='0'");

shuffle($spam); /* Перемешиваем элементы массива */
?>

Вопросов может быть сколько угодно. Не забудьте про все варианты ответа (i показывает, что регистр ввода неважен).

Форма обратной связи:

<form method="post" action="<?php echo $_SERVER['REQUEST_URI'] ?>">
	Имя: <input type="text" name="login" /><br />
	E-mail: <input type="text" name="e-mail" value=""><br />
	Сообщение: <br /><textarea name="message"></textarea>
	<?php echo $spam[0][0] ?>
	Ответ: <input type="text" id="myspam" size="20"/>
</form>

Как вы видите, здесь отсутствует кнопка «Отправить». Она появится с помощью JavaScript после того, как пользователь ответит правильно на поставленный вопрос. Сам код JavaScript пишем внизу файла:

<script type='text/javascript'>
document.getElementById('myspam').onkeyup = function(e){var v = this.value;if(<?php echo $spam[0][1] ?>){var inp = document.createElement('DIV');inp.innerHTML = '<input type="submit" value="Отправить!" />';this.parentNode.insertBefore(inp,this.nextSibling);this.onkeyup = null;}}
</script>

СВами