Задача CAPTCHA — защита от спама, флуда, перебора паролей и взлома аккаунтов.
Наш CAPTCHA будет выглядеть так:
Создадим php-скрипт captcha.php, который будет использоваться как изображение:
<?phpИ создаем php-файл index.php с формой:
// отправка заголовка
header("Content-type: image/jpeg");
// создаем изображение размерами 100x35
$im = imagecreate(140, 35);
// путь до ttf-шрифта (ОБЯЗАТЕЛЬНО НАДО ПРОПИСАТЬ ПУТЬ К СУЩЕСТВУЮЩЕМУ TTF, иначе скрипт не отработает)
$ttf = "font/RDO_L.TTF";
// Количество нарисованных линий
$line_count = 3;
// цвет текста
$font_color = array();
$font_color[] = imagecolorallocate($im, 0, 0, 0);
$font_color[] = imagecolorallocate($im, 255, 0, 0);
$font_color[] = imagecolorallocate($im, 0, 255, 0);
$font_color[] = imagecolorallocate($im, 0, 0, 255);
// цвет фона
$bg = imagecolorallocate($im, 244, 244, 244);
// заливаем рисунок сплошным цветом
imagefill($im, 0, 0, $bg);
// собираем строку
$str="";
for ($i = 0; $i < 3; $i++) {
mt_srand(time());
$str.=(rand(0, 9));
$str.=chr((rand(65, 90)));
}
// если сессия не создана, то создаем
if (!isset($_SESSION['genkey'])) session_register("genkey");
// присваевываем к сессии строку в md5
$_SESSION['genkey'] = md5(strtolower($str));
// начинаем выводить буквы на картинки
for ($i = 0; $i < strlen($str); $i++) {
if ($i%2==0) {
imagettftext($im, 15, rand(0, 20), ($i+1)*18, 25, $font_color[rand(0,3)], $ttf, $str[$i]);
} else {
imagettftext($im, 15, -rand(0, 20), ($i+1)*18, 25, $font_color[rand(0,3)], $ttf, $str[$i]);
}
}
// вывод линий
while ($line_count--) { imageline($im, rand(5, 15),rand(0, 35),rand(120, 140),rand(0, 35), $font_color[rand(0,3)]); }
// вывод изображения
imagejpeg($im);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">Вот и все. Проверьте только чтобы обязательно был верный путь к шрифту. Используемый шрифт можно скачать:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; utf-8" />
<title>Проверка защитного кода</title>
</head>
<body>
<?php
if (isset($_POST['genkey'])) {
// проверка на сущ-ие сессии
if (!isset($_SESSION['genkey'])) session_register("genkey");
if ($_SESSION['genkey']==md5(strtolower($_POST['genkey']))) {
// защитный код верный
} else {
// защитный код не верный
echo "<div>Защитный код не верный.<div>";
}
}
?>
<form action="?" method="POST">
<table>
<tr><td>Ваше имя:</td><td><input type="text" name="uname" /></td></tr>
<tr><td>Защитный код:
<img src="captcha.php" alt="key" />
</td><td><input type="text" name="genkey" /></td></tr>
<tr><td colspan="2"><input type="submit" /></td></tr>
</table>
</form>
</body>
</html>
RDO_L.TTF(1)
RDO_L.TTF(2)

у меня почему то выпадает ошибка Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at X:\home\localhost\www\Captcha2\index.php:8) in X:\home\localhost\www\Captcha2\index.php on line 11
ОтветитьУдалитькак думаете в чем тут дело?