PHP

Кривые знаки. Капча

Для защиты от автоматических регистраций, записей роботами в гостевые книги, ну, и тому подобных пакостей можно использовать фильтр, состоящий из искаженных знаков (капча). Человек эти знаки разглядит, в поле ввода наберет, нам отошлет, мы проверим и его пропустим - если правильно набрал. А робот может и не разглядеть. Ему - от ворот поворот. Код примера:

<?php
function picture(){
if(file_exists("password.jpg")){unlink("password.jpg");}
$img = imageCreate(100, 60);
for($i=0;$i<5;$i++){
$b[$i]=rand(0,9);
}
$password=implode("",$b);
$gray = imageColorAllocate($img, 161, 161, 161);
$black = imageColorAllocate($img, 0, 0, 0);
$white = imageColorAllocate($img, 255, 255, 255);
$green = imageColorAllocate($img, 0, 255, 0);
$red = imageColorAllocate($img, 255, 0, 0);
imageFill($img, 1, 1, $white);
for($i=0;$i<5;$i++){
$txtcolor=imageColorAllocate($img,rand(0,200),rand(0,200),rand(0,200));
imagettftext($img, 30, rand(-30,30),10+ 15*$i, 40,$txtcolor, "arial.ttf",$password{$i});
}
imagejpeg($img,"password.jpg");
return $password; }

$a=picture();
echo $a."<BR><img src=password.jpg>";
?>

Принцип работы очень прост: сначала создаем набор знаков и рисуем их на картинке. Это делает функция picture(). С нее скрипт и начинается:

function picture(){
if(file_exists("password.jpg")){unlink("password.jpg");}
$img = imageCreate(100, 60);

В цикле генерируем случайные цифры от 0 до 9, всего их в этом примере пять, но число может быть любым:

for($i=0;$i<5;$i++){
$b[$i]=rand(0,9);
}

Собираем полученные цифры в переменную $password:

$password=implode("",$b);

Определяем белый цвет и заполняем им поле будущего рисунка:

$white = imageColorAllocate($img, 255, 255, 255);
imageFill($img, 1, 1, $white);

Организуем цикл отрисовки цифр, цвет каждой цифры генерируется случайным образом во второй строке, в третьей цифра соответствующего цвета записывается на рисунок, параметр rand(-30,30) задает случайный наклон знака:

for($i=0;$i<5;$i++){
$txtcolor=imageColorAllocate($img,rand(0,200),rand(0,200),rand(0,200));
imagettftext($img, 30, rand(-30,30),10+ 15*$i, 40,$txtcolor, "arial.ttf",$password{$i});
}

Сохраняем получившийся рисунок, возвращаем значение созданного пароля и завершаем функцию:

imagejpeg($img,"password.jpg");
return $password; }

Осталось вывести значения пароля и картинку с кривыми цифрами:

$a=picture();
echo $a."<BR><img src=password.jpg>";

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

Рейтинг@Mail.ru