Скрипт текстовой CAPTCHA для защиты от спам-ботов (от 30.07.2012)
Автор:
Источник: /captcha.php
Практически каждый пользователь интернета регулярно сталкивается с CAPTCHA (в русском языке за этой аббревиатурой закрепилось существительное "капча"). В классическом случае CAPTCHA - это картинка, содержащая искаженные буквы и цифры, которые надо ввести в текстовое поле рядом для подтверждения того, что вы являетесь человеком, а не роботом, рассылающим спам. Существуют и более экзотические формы капчи, например, выполненные в форме теста, загадки или мини-игры. И все это ради защиты от автоматического заполнения форм роботами, рассылающими спам.
Классический внешний вид CAPTCHA показан на рисунке:
1. Защита от спама в соц.сети "ВКонтакте" . 2. reCAPTCHA.
CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) - это полностью автоматизированный публичный тест Тьюринга для
различия компьютеров и людей. Подробнее можно прочитать в Википедии.
Принцип работы CAPTCHA весьма прост. Пользователю демонстрируется задача (искаженная картинка, текст или что-то еще), которую человеческий мозг решает очень быстро и с большой вероятностью правильно. При этом решение такой задачи с помощью средств вычислительной техники либо очень трудоемко, либо сложно поддается алгоритмизации и, как следствие, требует огромных затрат на разработку решающей программы. После демонстрации задачи и получения ответа - ответ сравнивается с оригиналом и в случае его правильности, пользователю разрешается совершить действие - отправить форму с введенными данными на обработку. Спам-роботы же, на этом этапе как правило отсеиваются.
В этой статье мы поговорим о создании капчи своими руками, причем капча будет не классической в виде изображения, а текстовой.
Принцип работы нашей CAPTCHA будет таким. Капча будет формировать в текущей сессии две переменные:
1. Вопрос в виде арифметического выражения a+b, где 2<=(a+b)<=10;
2. Ответ в виде хэша md5 от результата суммы N+M, записанного прописью, например, md5("четыре").
Делаем предположение о том, что спам-роботы не смогут самостоятельно догадаться о том, что ответ нужно писать прописью. Также ответ прописью они не найдут и в переменных сессии, т.к. он не содержится там в явной форме, а содержится только его хэш.
При проверке капчи из ответа пользователя надо будет также получать хэш md5.
Программный код скрипта текстовой CAPTCHA
Файл mycaptcha.php, содержащий программный код для генерации вопроса и ответа CAPTCHA.
<?php
function GenerateCAPTCHA()
{
$nums = array("1"=>"один", "2"=>"два", "3"=>"три", "4"=>"четыре",
"5"=>"пять", "6"=>"шесть", "7"=>"семь", "8"=>"восемь", "9"=>"девять",
"10"=>"десять");
// формируем пример a+b
$rez = rand(2,10);
$a = rand(1,$rez-1);
$b = $rez-$a;
// записываем в сессию вопрос a+b
$_SESSION['mycaptcha_text']=$a." + ".$b;
// записываем в сессию хэш ответа прописью
$_SESSION['mycaptcha_string']=md5($nums[$rez]);
}
?>
Файл index.php, содержащий пример обращения и использования нашей CAPTCHA в пользовательской форме
<?php
session_start(); // запускаем сессию, она важна
include ("mycaptcha.php"); // вызываем модуль генерации CAPTCHA
if (!isset($_REQUEST['string'])) // если пользователь не ввел ответ,
{ // формируем и выдаем ему вопрос
generateCAPTCHA();
echo "Вопрос: ".$_SESSION['mycaptcha_text']."? ";
}
else // иначе проверяем правильность ответа пользователя и выдаем результат
{
if (md5(mb_strtolower(trim($_REQUEST['string']),"utf-8"))
== $_SESSION['mycaptcha_string'])
echo "Верно! ";
else
echo "Неверно! ";
}
?>
<form method="POST">
Введите ответ прописью, например, "четыре":<br/>
<input name="string"/>
</form>
В условии
if (md5(mb_strtolower(trim($_REQUEST['string']),"utf-8")) == $_SESSION['mycaptcha_string'])
Перед тем, как получить хэш md5 - убираем излишние пробелы по краям пользовательского ответа (функция trim()) и приводим ответ к нижнему регистру (функция mb_strtolower()).
Сложность данного примера можно повысить, изменив строку в файле mycaptcha.php:
$_SESSION['mycaptcha_text']=$a." + ".$b;
на
$_SESSION['mycaptcha_text']=$nums[$a]." + ".$nums[$b];
В таком случае, вопрос a+b будет выводиться также прописью, что затруднит его считывание роботом.
Для того, чтобы пример работал корректно, необходимо:
1. Все файлы должны быть записаны в кодировке UTF-8.
2. Скрипты должны выполняться на веб-сервере, а не запускаться в браузере, как файл.
Скачать исходные файлы примера (2 кб):
/files/captcha.zip
Механизм CAPTCHA можно применять для защиты гостевых книг, комментариев, форм обратной связи от спама, а также для защиты форм регистрации от прохождения автоматических регистраций спам-ботами.
Хотите дополнить - пишите:
Статьи по теме
Делаем форму обратной связи на сайт с защитой от спама;
Скрипт для голосования своими руками на PHP и MySQL с использованием AJAX;
Гостевая книга своими руками на PHP и MySQL.
Гостевая книга своими руками на PHP и MySQL. Добавляем динамизма. AJAX + jQuery.
|