пятница, 23 октября 2009 г.

Капча? Как два пальца об асфальт....

Как сделать быструю captcha?
Создаем файл в корне сайта pic.php с таким кодом внутри:


<?
if (!isset($_SESSION)) session_start();

$r=rand(1000000,9999999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 7;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
imagecolorallocate($im,255,255,255);
$a=0;
for($i=0;$i < 7;$i++)//наносим код на картинку
{
$color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagestring($im,rand(2,9),$a+=15,rand(0,20),$arr[$i],$color);
}
header("Content-type: image/jpeg");
imagejpeg($im,'',100);//выводим капчу
?>


Данный код будет генерировать нам картинку, и код, изображенный на рисунке сохраняется в переменную $_SESSION. Проверяем, видно ли картинку запросом site.ru/pic.php
Если картинкас цифрами появилась, то все в порядке и идем дальше.
В форме запроса на странице добавляем поле, в которое наш пользователь вводит число с картинки:


Введите число, изображенное на картинке: <img src="/pic.php">
<input type="text" name="captcha_code">


Ну и в скрипте обработчике проверяем, на правильность:


if(!isset($_SESSION)) session_start();
if($_POST != $_SESSION['captcha_code']) echo "Капча введена неверно"; else echo "Капча введена правильно";


Все!
Добавить к вышесказанному можно только еще варианты картинок:

Наклонные цифры:



<?
if (!isset($_SESSION)) session_start();

$r=rand(1000000,9999999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 7;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
$font = 'arial.ttf';
imagecolorallocate($im,255,255,255);
$a=0;
for($i=0;$i < 7;$i++)//наносим код на картинку
{
$color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagettftext($im, 13, rand(-50,50), $a+=14,rand(15,25), $color, $font, $arr[$i]);
}

header("Content-type: image/png");
imagepng($im);//выводим капчу
?>



усложняем квадратами


<?
if (!isset($_SESSION)) session_start();

$r=rand(10000,99999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 5;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
imagecolorallocate($im,255,255,255);
$a=0;
$color_w=imagecolorallocate($im,255,255,255);
$color_g=imagecolorallocate($im,50,50,50);
for($i=0;$i < 5;$i++)//наносим код на картинку
$arr_=imagettftext($im, 20, rand(-30,30), $a+=21, rand(17,33),$color_g,
"../gothica.ttf",$arr[$i]);

for($i=20;$i < =100;$i+=40)//ставим 3 защитных квадратика
rev($im,$i,rand(10,30));

function rev(&$im,$x,$y)//функция реверсии цвета
{
global $color_w,$color_g;
$w=$h=rand(15,30);
for($i=$x-$w/2;$i < $x+$w/2;$i++)
for($k=$y-$h/2;$k < $y+$h/2;$k++,$color_p=imagecolorat($im,$i,$k))
if($color_p>$color_w)
imagesetpixel($im,$i,$k,$color_w);
else
imagesetpixel($im,$i,$k,$color_g);
}
header ("Content-type: image/png");
imagepng($im); //выводим капчу
imagedestroy($im);
?>

2 комментария:

ReDLiNe комментирует...

помогите пожалуйста сделал все как было рассказано, но когда допустим я ввожу имя, email и комментарий но не ввожу саму капчу комментарий добавляется но при этом пишет что капча введена неверно или если даже я ввожу капчу и ввожу правильно он все равно пишет что капча введена неверно но все что я ввожу ранее все добавляется! помогите пожалуйста, заранее огромное спасибо!

Денис комментирует...

Вы наверное сделали все буквально
ОДнако следующий код только демонстрирует, как проверять капчу
if($_POST != $_SESSION['captcha_code']) echo "Капча введена неверно"; else echo "Капча введена правильно";

Если вы пишете обработчик полей, то следует писать примерно так
if($_POST != $_SESSION['captcha_code']) {
//действия при неуспешном введении капчи, вывод страницы ошибок
}
else {
//действия по сохранению комментария
//вывод страницы успеха
}