Арифметическая капча

Пару примеров арифметической капчи.

Вариант 1.

Выдаем изображение и записываем значение в сессию. Файл: captcha.php

<?php
session_start
();// Начинаем сессию
$number_1
= rand(1,100);// Генерируем 1-е случайное число
$number_2
= rand(1,100);// Генерируем 2-е случайное число
$_SESSION
['rand_code']= $number_1 + $number_2;// Записываем их сумму в сессию
$dir
="fonts/";// Директория с шрифтами
$image
= imagecreatetruecolor(200,60);// Создаём изображение
$color
= imagecolorallocate($image,200,100,90);// Задаём 1-й цвет
$white
= imagecolorallocate($image,255,255,255);// Задаём 2-й цвет
imagefilledrectangle
($image,0,0,399,99, $white);// Делаем капчу с белым фоном
imagettftext
($image,30,0,10,40, $color, $dir."verdana.ttf","$number_1 + $number_2");// Пишем текст
header
("Content-type: image/png");// Отсылаем заголовок о том, что это изображение png
imagepng
($image);// Выводим изображение
?>

Код достаточно прокомментирован. Аналогично создаются любые другие капчи с арифметическими операциями. Т.е. вы можете поставить вместо знака плюс — любое другое арифметическое действие. А также формировать целые выражения. Основной момент — запись результата в сессию для дальнейшей проверки ввода данных пользователя.

Выводим капчу:

<img src="captcha.php" alt=""/>

Проверяем капчу:

<?php
session_start
();// Начинаем сессию
$captcha
= $_POST["captcha"];// Ответ пользователя
/* Проверяем правильность ввода капчи (не забывайте проверять на "пустое значение") */
if(($capctha == $_SESSION["rand_code"])&&($captcha !="")) echo "Капча введена правильно";
else echo "Капча введена неправильно";
?>

Вариант 2.
Весь исходник состоит их двух файлов, index.php – форма для ввода капчи и код проверяющий корректность введенной капчи, capcha.php – скрипт генерирующий капчу.

Начнем с формы — файл index.php, вот ее код:
Весь исходник состоит их двух файлов, index.php – форма для ввода капчи и код проверяющий корректность введенной капчи, capcha.php – скрипт генерирующий капчу.

Начнем с формы — файл index.php, вот ее код:


<br/><br/>
<form method="post" action="index.php" >    
<img src="capcha.php" width="120" height="40" /><br />     
Код с картинки: <input type="text" name="capcha" /><br />     
<input type="submit" value="Отправить" /></form>

Код генерации капчи

//========= Задаем параметры капчи(при желании можно вынести в отдельный файл — config)
// шрифт символов на капче( шрифт лучше положить в папку со скриптом)
$font = ‘Arial_Regular.ttf’;
// Размер шрифта
$fontsize = 20;
// Размер капчи
$width = 120; // — длина
$height = 40; // — высота
// количество полосок на капче
$countLine = 3;
//==========

// Задаем заголовок для вывода картинки
header(‘Content-type: image/png’);
// Создаем изображение
$img = imagecreatetruecolor($width, $height);
// фон для капчи
$white = imagecolorallocate($img, 220, 220, 220);
imagefill($img, 0, 0, $white);
// Переменная, для хранения значения капчи
$capchaText = »;

// придумываем пример для капчи
$a = mt_rand(1, 19);
$b = mt_rand(1, 19);
$capchaText = $a . ‘+’ . $b . ‘=’;
// Ответ на пример, запишем в сессию для проверки
$capchaResult = $a + $b;

// ========= Заполням изображение символами
for ($i = 0; $i < strlen($capchaText); $i++){
// Из списка символов, берем случайный символ
$litteral = $capchaText[$i];
// Вычесляем положение одного символа
$x = ($width — 20) / strlen($capchaText) * $i + 10;
$y = $height — (($height — $fontsize) / 2);
// Сгенерируем случайный цвет для символа.
$color = imagecolorallocate($img, rand(0, 150), rand(0, 150), rand(0, 150) );
// Генерируем угол наклона символа
$naklon = rand(-10, 10);
// Рисуем один символ
imagettftext($img, $fontsize, $naklon, $x, $y, $color, $font, $litteral);
}
// ==========

// ========== Добавим на капчу несколько рандомных полосок
for ($i = 0; $i < $countLine; $i++){
// сгенерируем координаты для линии
$part = $width/100; // длина картинки в процентах
$x1 = mt_rand(0, round($part*30)); // x1 не больше чем до 30% картики
$y1 = mt_rand(0, $height);
$x2 = mt_rand(round($part*70), round($part*100)); // x2 не меньше чем от 70% картики
$y2 = mt_rand(0, $height);
// сгенерируем случайный цвет для линии
$color = imagecolorallocate($img, rand(0, 150), rand(0, 150), rand(0, 150) );
imageline ($img, $x1, $y1, $x2, $y2, $color );
}
// ==========

// Запускаем сессию, и записывем в нее значение капчи. Это понадобится для проверки с тем, что вводит юзер
session_start();
$_SESSION[‘capcha’] = $capchaResult;
// вывод капчи на страницу
imagepng($img);
// чистим память, корторую мы заняли при создании картинки
imagedestroy($img);

Вот и все, арифметическая капча готова.

Также пользуется популярностью создание текстовой капчи.