среда, 30 сентября 2009 г.

PHP: Создание защитного кода, создание капчи (CAPTCHA)

CAPTCHA — это аббревиатура от английских слов "Completely Automatic Public Turing Test to Tell Computers and Humans Apart" — полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей. Другими словами CAPTCHA — это компьютерный тест, который используется для определения пользователя системы (человек или компьютер).
Задача CAPTCHA — защита от спама, флуда, перебора паролей и взлома аккаунтов.

Наш CAPTCHA будет выглядеть так:




Создадим php-скрипт captcha.php, который будет использоваться как изображение:
<?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);
?>

 И создаем php-файл index.php с формой:
<!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)

1 комментарий:

  1. у меня почему то выпадает ошибка 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
    как думаете в чем тут дело?

    ОтветитьУдалить