Капча (Captcha) – это модуль позволяющию защитить свой ресурс от спама злостных роботов (ботов).
Рассмотрим принцип работы стандартного модуля Капча:
Модуль генерирует картинку с проверочным кодом,
Скрипт показывает это картинку на странице внутри формы.
А перед показом страницы пользователю отправляется параметр сессии с этим самым кодом.
Пользователь отправляет форму и с ней введенный код если он его правильно понял по картинке.
23/07 09:30 Поправка:
Модуль исправлен и переработан. Цель переработки – использование сессий как самого надежного механизма сохранения секретной строки в тайне. Спасибо за ценные советы Сергею (captcha.ru).
Вот так выглядит картинка капчи данного скрипта:

Вот так будем проверять введенный код:
<?
$captcha_check = FALSE;
if (!isset($_SESSION)) session_start();
if (isset($_POST['random_string']))
if (isset($_SESSION['random_string']))
if ($_POST['random_string'])
if ($_POST['random_string']==$_SESSION['random_string']) {
$captcha_check = TRUE;
unset($_SESSION['random_string']);
}?>
Вот так будем вызывать капчу:
<? if (isset($_POST['random_string']) && $captcha_check) {?>
<div>Код введен правильно!</div>
<?} elseif(isset($_POST['random_string'])) {?>
<div>Код введен НЕПРАВИЛЬНО поробуйте еще раз!</div>
<? } ?>
<form method="POST" action="<?= $_SERVER['PHP_SELF'] ?>">
<img src='/captcha.php' border=1><br />
<input type=text name=random_string><br />
<input type="submit" class="form-submit" value="Проверить" />
</form>
Для персонального/особенного отображения капчи вам, возможно, потребуется найти
новый шрифт.
Их полно в сети, поищите
download+free+gdf+fonts
Теперь сам модуль капча:
<?php
if (!isset($_SESSION)) session_start();
$random_string = mt_rand(1000,9999);
$_SESSION['random_string'] = $random_string;
$font = imageloadfont('anonymous.gdf'); // подставьте сюда имя шрифта который вы будете использовать
if (!$font) $random_string = "FONT NOT FOUND";
$fontWidth = imagefontwidth($font);
$fontHeight = imagefontheight($font);
$width = strlen($random_string) * $fontWidth;
$height = $fontHeight;
$img = @ImageCreate ($width, $height) or die ("Cannot Initialize new GD image stream");
$background_color = @imagecolorallocate($img, 255, 255, 255);
$text_color = @imagecolorallocate($img, 0, 0, 0);
@imagestring($img, $font, 0, 0, $random_string, $text_color);
$img2 = @ImageCreate ($width, $height) or die ("Cannot Initialize new GD image stream");
$x=1;
$i=0;
// собственно сам алгоритм:
while ($x<$width) { // идем по X-су и копируем кусочки
$xx = mt_rand(1,2); // c этим промежутком можно поиграть
$yy = mt_rand(5,10); // c этим промежутком можно поиграть
$i=$i+($xx/10); // шаг для Sin-уса
$y = ceil(sin($i)*$yy);// смещение по Y-ку
@imagecopy ($img2, $img, $x, $y, $x, 0, 1, $height); // копирование кусочка
$x++;
}
// отправляем заголовки для предотвращения кэширования
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header ("Content-type: image/png");
ImagePng ($img2);
@imagedestroy($img2);
@imagedestroy($img);
?>
Все. Должно работать, проверяйте.
7 Responses to “Создаем свой модуль капчи (Captcha).”
Sorry, the comment form is closed at this time.
А ещё проще – использовать функцию imagettftext(), использующую любой ttf-шрифт.
вот пример моей функции создания капчи:
function create_capcha_image($str) // аргумент – последовательность символов на капче
{
$img = imagecreatefromjpeg(“background_image.jpg”); // 89×30 px
$color = imagecolorallocate($img, 48, 112, 33);
$str_arr = preg_split(‘//’, $str, -1, PREG_SPLIT_NO_EMPTY); // разбиваем строку на массив символов
$font_name = ‘tahoma.ttf’;
$font_size = 15;
$x_pos = 0;
$y_pos = 22;
$chars = count($str_arr);
for ( $i = 0; $i
for ( $i = 0; $i < $chars; $i++ )
{
$x_pos = $x_pos + 17; // каждую следующую букву двигаем
$angle = mt_rand(-30, 30); // поворачивая её на случайное количество градусов
imagettftext($img, $font_size, $angle, $x_pos, $y_pos, $color, $font_name, $str_arr[$i]);
}
$temp_file = “images/”.md5(time()).”.png”; // куда-нибудь сохраняем промежуточный результат …
imagepng($img, $temp_file);
imagedestroy($img);
return $temp_file; // … и выводим его куда захотим. Не забыть потом его удалить, чтоб не мусорить на сервере
}
P.S.: в довесок – функция, создающая случайную последовательность:
function get_random_string($length) // количество символов
{
$ret = “”;
for ( $i=0; $i<$length; $i++)
{
if ( mt_rand(1,2) == 1 )
$char_code = mt_rand(48, 57); // цифра…
else
$char_code = mt_rand(65, 90); // .. или буква
$ret .= chr($char_code);
}
return $ret;
}
Как сделать кнопку ‘Обновить код’, что бы данные из формы не потерялись при обновлении кода
> Как сделать кнопку ‘Обновить код’, что бы данные из формы не потерялись при обновлении кода
Необходимо задать тегу изображения капчи (напр.: <img src=”capcha.php” />) аттрибут id (напр.: capcha-image),
после чего создать ссылку, которая будет обновлять у изображения атрибут src.
На выходе получаем:
<img src=”capcha.php” id=”capcha-image” /><br />
<a href=”javascript:void(0);” onclick=”document.getElementById(‘capcha-image’).src = ‘capcha.php?rid=’ + Math.random();”>Refresh Capcha</a>
Вот и все.
Все работает. Спасибо.
для dain:
не надо разбивать строку на массив символов. Строка – это уже и есть массив символов
$str_arr['0'] – первый символ
$str_arr['1'] – второй символ
я сделал так:
$chars=’qwertyupasdfghjkzxcvbnm2346789′; //допустимые символы
… создание изображения, создание помех …
//случайный символ из набора разрешенных
$rndchr=$chars[rand(0, (strlen($chars)-1))];
dain писал: “А ещё проще – использовать функцию imagettftext()”
Но сложнее найти хостинг где эта гавнофункция работает (