Главная » Полезные статьи » Язык PHP » CAPTCHA на PHP: реализация скрипта каптчи на php
Распечатать статью

CAPTCHA на PHP: реализация скрипта каптчи на php

CAPTCHA на PHPСегодня мы поговорим о создании скрипта генерации случайной комбинации цифр на картинке, средствами php. Или, как принято сейчас говорить каптча (captcha). Для написания каптчи на php, нам понадобиться создать всего лишь один файл, что очень просто и удобно при его дальнейшем использовании.

Что такое CAPTCHA?

CAPTCHA (от англ. completely automated public Turing test to tell computers and humans apart — полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей). Человеческим языком, каптча это тест, который определяет, является ли пользователь роботом или человеком. Достигается это, как правило, с помощью картинки с искаженными символами, которые способен прочитать только человек.

Примеры каптчи

Принцип работы каптчи на PHP

Решения реализации captchaна php могут быть разными. Я организовал это с помощью сессий ($_SESSION). При выводе картинки (каптчи) генерируется код, который записывается в сессии, а при проверке сравнивается соответствие кода с картинки и предварительно записанного в сессию. На мой взгляд, это просто и удобно, если вы не согласны, подскажите как лучше, в комментариях к статье.

А теперь рассмотрим практическую сторону.

Шаг 1 – Создание файла каптчи: captcha.php

Ниже предоставлен код этого файла:

<?php
session_start();
header(«Content-type: image/gif»);
$code = rand(100, 999);///Случайное число
$color1 = rand (10, 200);
$color2 = rand (10, 200);
$color3 = rand (10, 200);
$_SESSION['code'] = $code;
$rgb=0xffffff;//цвет заливки
$txt_box=imagettfbbox(18, 0, «lib/font.ttf»$code);
if($txt_box[0]<0){$txt_box[0]=$txt_box[0]*(-1);}
if($txt_box[1]<0){$txt_box[1]=$txt_box[1]*(-1);}
if($txt_box[2]<0){$txt_box[2]=$txt_box[2]*(-1);}
if($txt_box[3]<0){$txt_box[3]=$txt_box[3]*(-1);}
if($txt_box[4]<0){$txt_box[4]=$txt_box[4]*(-1);}
if($txt_box[5]<0){$txt_box[5]=$txt_box[5]*(-1);}
if($txt_box[6]<0){$txt_box[6]=$txt_box[6]*(-1);}
if($txt_box[7]<0){$txt_box[7]=$txt_box[7]*(-1);}
$box_width=($txt_box[0]+$txt_box[2]+$txt_box[4]+$txt_box[6])/2;
$box_height=($txt_box[1]+$txt_box[3]+$txt_box[5]+$txt_box[7])/2;
$img = imagecreatetruecolor($box_width+1,$box_height+1);//вспомагательное изображение
imagefill($img, 0, 0, $rgb);//заливаем его …
imagettftext($img, 18, 0, 1, $box_height-2, imageColorAllocate($img$color1,$color2,$color3), «lib/font.ttf»$code);
imagegif($img);//готово к употреблению
//убираем после себя
imagedestroy($img);
?>

session_start(); — запускаем сессию в PHP.

header(«Content-type: image/gif»); — нашакартинка (каптча) будетв GIF формате.

$code = rand(100, 999); — Генерируем случайный трехзначный цифровой код. Как вариант можно и буквенный, это уже тонкости вашего желания.

$color1 = rand (10, 200); $color2 = rand (10, 200); $color3 = rand (10, 200); — Генерациякодацвета цифр (1 – R, 2 – G, 3 – B). Почему диапазон 10-200, а не 0-255? Что-бы не было черных и белых цветов. Хотя, все зависит от вашего мастерства, можете реализовать разные цвета для каждого символа.

$_SESSION['code'] = $code; — Записываем сгенерированный код в переменную сессии.

$rgb=0xffffff; — Цвет заливки фона изображения (каптчи).

$txt_box=imagettfbbox(18, 0, «lib/font.ttf«, $code); — создаем текстовый слой в котором код нашей каптчи. Как видите, подключаем шрифт (font.ttf) из папки lib, 18 – это размер шрифта, 0 – это угол поворота текста (мы поворачивать не будем), $code – это текст каптчи. Этот слой создается для того, что-бы вычислить в дальнейшем вычислить в пикселях размеры текстового блока.

if($txt_box[0]<0){$txt_box[0]=$txt_box[0]*(-1);}

if($txt_box[1]<0){$txt_box[1]=$txt_box[1]*(-1);}

if($txt_box[2]<0){$txt_box[2]=$txt_box[2]*(-1);}

if($txt_box[3]<0){$txt_box[3]=$txt_box[3]*(-1);}

if($txt_box[4]<0){$txt_box[4]=$txt_box[4]*(-1);}

if($txt_box[5]<0){$txt_box[5]=$txt_box[5]*(-1);}

if($txt_box[6]<0){$txt_box[6]=$txt_box[6]*(-1);}

if($txt_box[7]<0){$txt_box[7]=$txt_box[7]*(-1);}

$box_width=($txt_box[0]+$txt_box[2]+$txt_box[4]+$txt_box[6])/2;

$box_height=($txt_box[1]+$txt_box[3]+$txt_box[5]+$txt_box[7])/2;

Этот страшный код вычисляет в пикселях ширину и высоту текстового блока. Знаю, написано не грамотно, но я писал давно. К тому же, будет над чем и вам потрудиться.

$img = imagecreatetruecolor($box_width+1,$box_height+1); — создаем изображение, немножко большее нашего текстового блока.

imagefill($img, 0, 0, $rgb); — заливаем его цветом указанным раньше.

imagettftext($img, 18, 0, 1, $box_height-2, imageColorAllocate($img, $color1,$color2,$color3), «lib/font.ttf«, $code); — вот собственно налаживаем текст на изображение $img, 18 – размер шрифта, 0 – угол наклона, 1 – позиция текста по X, $box_height-2 – позиция текста по Y, далее указываем цвет наших символов, путь к шрифту .ttf, и собственно текст каптчи.

imagegif($img); — выводим изображение на монитор.

imagedestroy($img); — очищаем память, после вывода изображения.

Данный скрипт, будет восприниматься, как обычная картинка.

Шаг 2 – Применение captcha.php

В практическом применении скрипта captcha, нам необходимо вывести картинку и поле ввода, для текста. Вот пример:

<img src= ‘ captcha.php ’  alt= ‘ Пример каптчи на php ’ />
<input type= ‘ text ’ name= ‘ user_code ’ >

Пример моей captcha  (форма добавления сообщения в гостевой книге):

Пример моей captcha

Само собой помещаем HTML код в вашу форму, которая например, будет ссылаться на add.php. В этом файле будем проверять соответствия введенных данных пользователем. Пример кода add.php подан ниже:

<?php
session_start();
if($_GET[' user_code '] == $_SESSION[' code '])
{
echo ‘Ура, я не робот, спасибо сайту sitear.ru!’;
}
else
{
echo ‘ Я робот!’;
}
?>
Источник:  sitear.ru
Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи