Скрипт капчи для защиты от автоматической регистрации (captcha)


Наверняка при регистрации на каком-нибудь сайте, например на сайте доски объявлений, вы сталкивались с тем, что вас просили ввести цифровой или буквенный код, указанный на картинке. Написанием подобного скрипта мы и займемся.

Вообще эта функция в среде разработчиков и оптимизаторов называется CAPTCHA - это аббревиатура от английских слов <Completely Automatic Public Turing Test to Tell Computers and Humans Apart> - полностью автоматический тест Тьюринга для различения компьютеров и людей.

Для работы с графическими изображениями на сервере должна быть установлена библиотека GD. О ее наличии можно узнать у администратора или через утилиту phpinfo.

Для начала мы создадим форму, в которую поместим поле для ввода чисел, которое пользователь увидел на картинке, а также само изображение, сгенерированное скриптом.

<?
// здесь выше какая-то форма, которую пользователь должен заполнить

echo "Код на картинке:";
echo "<img src=code.php>";
// файл code.php - это и есть скрипт, который генерирует случайную картинку. Его текст будет приведен далее. <img src=:> - стандартный html-тэг вывода изображения.

echo "<input type=text name=number size=20";
// это поле для ввода значения на картинке.

// далее продолжение формы.
?>

Теперь в этом же файле делаем проверку на соответствие введенного кода коду, изображенному на картинке. Вставляем такую строку:

if ($_COOKIE['reg_num'] != $number) {echo "Не верный цифровой код!";}
// если введен неверное сочетание цифр, то пользователь увидит надпись: Неверный цифровой код!

Соответственно, чтобы продолжить выполнение скрипта или просто выдать надпись, что код верен, если он действительно соответствует коду на картинке, то нужно написать такую строку:

if ($_COOKIE['reg_num'] == $number) {echo "Спасибо! Код верен!";}
// пользователь увидит надпись: Спасибо! Код верен!

Ну и теперь сам файл, генерирующий код на картинке. В нашем случае он имеет имя code.php.

<?
header("Content-type: image/png");
// указываем на то, что мы используем графический файл png.

srand((double)microtime()*1000000);
// включаем генератор случайный чисел.

$num = rand('111111','999999');
// присваивам переменной $num случайное значение в диапозоне от 111111 до 999999.

setcookie('reg_num', $num);
// сохраняем результат в cookie.

$img = imagecreate('50','15');
$back = imagecolorallocate($img, 218, 218 ,218);
$black = imagecolorallocate($img, 0, 0, 0);
imageline($img, 0, 0, 49, 0, $black);
imageline($img, 0, 0, 0, 14 , $black);
imageline($img, 0, 14, 49, 14 , $black);
imageline($img, 49, 0, 49, 14 , $black);
imagestring($img,3,5,0,$num,$black);
// создаем прямоугольную картинку размером 50x15 с черными рамочками и вписанным в нее черным текстом - шестизначным числовым кодом.

imagepng($img);
// выводим созданное изображение на экран.

?>

Вот и все. Совсем не трудно. Однако следует заметить, что в последнее время в связи с распространением программ автоматической регистрации и усовершенствованием технологии распознавания символов, такой простой код может быть распознан такими программами. Поэтому его можно усложнить, добавив разные полосы, черточки, штрихи и т.д., как это сделано на ряде сайтов. Только не переусердствуйте. Подумайте не только о роботах, но и о пользователях, которые наверняка вспомнят создателя сайта не добрым словом, когда после очередной неудачной попытки распознать текст на картинке, он покинет ваш сайт, так и не добившись того, чего хотел. Знайте во всем меру.

Удачи в программировании!

©Невежин Евгений
http://nevius.ru
30.05.2007

При перепечатке информации ссылка на сайт http://nevius.ru обязательна.