PHP

Скрипт капчи

Капча это обычное изображение, на котором находится произвольный текст. Рядом с ним располагается текстовое поле, куда пользователь-человек должен ввести изображенный текст.

О капче.

Сегодня, довольно часто бывает, что сайт атакуют «спам-боты». Они постоянно регистрируются или оставляют массу ненужных Вам сообщений, что в итоге может привеcти к перегрузке баз данных или даже сбою работы сайта.
Для того чтобы решить проблему ботов, придумана специальная защита – «капча» (или «captcha»).
Обычный бот, производя распознавание капчи к правильному ответу не придет, так как подобную картинку сканировать не сможет, а, следовательно, в большинстве случаев будет не возможен автоматический ввод капчи и бот не зарегистрируется и не оставит сообщение.
Ввод капчи осуществляется пользователем, после чего скрипт сравнивает этот текст с сохраненным оригиналом, если все верно, то запрос принимается, иначе выводится соответствующее сообщение.
Итак, для того чтобы оградить свой сайт от большинства простых спам атак, то такая капча, вам очень пригодиться. По сути, это автоматическая капча, изображение которой генерируется специальным скриптом и реализация его более чем проста. Ниже приведем урок по ее созданию, также вы сможете ее скачать, капча с исходным кодом находится тут же.

Задача:

Скрипт капчи - создать программу для капчи с прозрачным фоном, размером 120 на 20 и добавить ее на форму отправки запроса.
Кроме того стоит отметить, чтобы скрипт мог работать, необходимо включить в настройках PHP расширение GD.

Решение:

Пункт 1.
Для примера нам понадобится файл шрифтов comic.ttf, его можно найти в каталоге со шрифтами Вашей операционной системе или скачать из интернета. Сохраняем его в директорию «font» (в каталоге с сайтом).
Далее создаем два файла:
- captcha.php
- index.php
Пункт 2.
Открываем файл captcha.php и вводим следующий код:
Листинг № 1 - Скрипт капчи
<?php 

// Задаем список символов, используемых в капче 
$capletters = 'ABCDEFGKIJKLMNOPQRSTUVWXYZ123456789';  
// Длина капчи 7 знаков 
$captlen = 7;  

// Устанавливаем размеры изображения 
$capwidth = 120; $capheight = 20;  

// Подключаем шрифт 
$capfont = 'font/comic.ttf';  

 // Размер нашего текста 
$capfontsize = 14; 

// Переопределяем HTTP заголовок, чтобы контент нашего  
// скрипта представлял собой не текст, а изображение 
header('Content-type: image/png');  

// Формируется изображение с указанными ранее размерами 
$capim = imagecreatetruecolor($capwidth, $capheight);  

// Устанавливаем необходимость применения альфа канала (прозрачности) 
imagesavealpha($capim, true);  

// Устанавливаем цвет фона, в нашем случае - прозрачный 
$capbg = imagecolorallocatealpha($capim, 0, 0, 0, 127); 

// Устанавливаем цвет фона изображения 
imagefill($capim, 0, 0, $capbg);  

// Задаем начальное значение капчи 
$capcha = ''; 

// Запускаем цикл заполнение изображения 
for ($i = 0; $i < $captlen; $i++){ 

// Из нашего списка берем «рендомный» символ и добавляем в капчу 
$capcha .= $capletters[rand(0, strlen($capletters)-1) ];  

// Вычисление положения символа по X оси 
$x = ($capwidth - 20) / $captlen * $i + 10; 

// Добавим «рендомности» в это положение. 
$x = rand($x, $x+5);  

// Находим положение по Y оси 
$y = $capheight - ( ($capheight - $capfontsize) / 2 );  

// Укажем случайный цвет для символа. 
$capcolor = imagecolorallocate($capim, rand(0, 100), rand(0, 100), rand(0, 100) );  

// Наклон для символа 
$capangle = rand(-25, 25);  

// Рисуем созданный символ, применяя все описанные параметры 
imagettftext($capim, $capfontsize, $capangle, $x, $y, $capcolor, $capfont, $capcha[$i]); 

} // Закрываем цикл 

// Создаем переменную, куда будет сохранена капча,  
// с ней будет сравниваться введенный пользователем текст 
session_start(); 

$_SESSION['capcha'] = $capcha; 

imagepng($capim); // Выводим картинку. 

imagedestroy($capim); // Очищаем память. 

?>

Сохраняем файл captcha.php.
Пункт 3.
Открываем файл index.php и добавляем код. Это сама страница в которой будет вводиться капча.
Листинг № 2 - Скрипт файла index.php
<?php 
// Проверяем если капча была введена 
if ( isset($_POST['capcha']) ) 
{ 
$code = $_POST['capcha']; // Получаем переданную капчу. 
session_start(); 

// Сравниваем введенную капчу с сохраненной в переменной в сессии 
if(isset($_SESSION['capcha']) && strtoupper($_SESSION['capcha']) == strtoupper($code))  
{echo 'Верно!';} 
else 
{echo 'Не верно!';} 

// Удаляем капчу из сессии 
unset($_SESSION['capcha']);  

exit(); 
} 
?>

Пункт 4.
Ниже вводим HTML код:
Листинг № 3 - Форма ввода капчи. Это тот же файл 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">
<head>
<title>Тест</title>
<meta http-equiv="Content-Type" content="text/html;charset=windows-1251" />
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<img src="captcha.php" width="120" height="20" /><br />
Введите капчу: <input type="text" name="capcha" /><br />
<input type="submit" value="Отправить" />
</form>
</body>
</html>

Сохраняем файл. Все, наша «капча» готова.
Добавлено: 09 Сентября 2013 12:38:57 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...