Сегодня мы поговорим о создании скрипта генерации случайной комбинации цифр на картинке, средствами php. Или, как принято сейчас говорить каптча (captcha). Для написания каптчи на php, нам понадобиться создать всего лишь один файл, что очень просто и удобно при его дальнейшем использовании.
Что такое CAPTCHA?
CAPTCHA (от англ. completely automated public Turing test to tell computers and humans apart — полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей). Человеческим языком, каптча это тест, который определяет, является ли пользователь роботом или человеком. Достигается это, как правило, с помощью картинки с искаженными символами, которые способен прочитать только человек.
Принцип работы каптчи на PHP
Решения реализации captchaна php могут быть разными. Я организовал это с помощью сессий ($_SESSION). При выводе картинки (каптчи) генерируется код, который записывается в сессии, а при проверке сравнивается соответствие кода с картинки и предварительно записанного в сессию. На мой взгляд, это просто и удобно, если вы не согласны, подскажите как лучше, в комментариях к статье.
А теперь рассмотрим практическую сторону.
Шаг 1 – Создание файла каптчи: captcha.php
Ниже предоставлен код этого файла:
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, нам необходимо вывести картинку и поле ввода, для текста. Вот пример:
Пример моей captcha (форма добавления сообщения в гостевой книге):
Само собой помещаем HTML код в вашу форму, которая например, будет ссылаться на add.php. В этом файле будем проверять соответствия введенных данных пользователем. Пример кода add.php подан ниже: