Войти Регистрация

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 ' Я робот!';

}

?>

Заключение

Надеюсь, вы поняли принцип работы captcha php скрипта. Если у вас остались вопросы или недопонимания по поводу реализации captcha на php, вы можете задать вопрос в комментариях. 



Дальше: Монетизация трафика: как монетизировать трафик?


Дискуссия по теме    11 Комментариев
Добавить комментарий
Сережа 24.12.2013 в 20:25
Помогите устоновить пожалуйста к себе на сайт я не врубаюсь ни фига плачу 50 р плиз пишите сюда vipsergey1997@mail.ru
Тарас 21.01.2014 в 07:25
Сережа! Где обещанные 50р? Файлы то ведь получил по почте... не надежный человек! Запомните этот email, никому не советую иметь дело с этим человеком.
Руслан 08.12.2013 в 15:42
Заработало!!) я файл напрямую из Notepad открыл в браузере и получилось, что он показал его как обычный файл на диске, т.е. без обработки сервером Apache. Прописал http://localhost/1/Captcha/form.php и заработало!! Спасибо за статью!!!
Тарас 08.12.2013 в 16:22
Пожалуйста! Пользуйтесь на здоровье.
Руслан 08.12.2013 в 12:54
У меня что тоне получается. Шрифт подключил, а изображение не выводит?
Михаил 19.12.2012 в 15:28
На самом деле в переменную code можно записывать не просто код а его прообраз в md5 то есть md5($code). И на сервере потом уже сравнивать не код а хешированные его значения if(md5($_GET[' user_code ']) == $_SESSION[' code '])
K313 17.12.2011 в 15:07
CAPTCHA_K313 created: 0.0015 sec.
Тарас 14.11.2011 в 16:21
Pavel, сессии доступны только для самого скрипта PHP, на сервере обрабатывается скрипт, а бот может увидеть только результат (картинку каптчи). Если вы знаете, как можно обойти этот скрипт каптчи, покажите, буду искать другие методы защиты.
Pavel 12.11.2011 в 12:15
По-моему, такую капчу бот обойдет очень легко - достаточно посмотреть код в сессии...
Тарас Мороз 20.09.2011 в 14:42
Конешно должна быть, это же подключаемый файл шрифта.
Гость 20.09.2011 в 09:28
Чето нет результата... Код в сессию сгенерировался, я проверил, а вот картинка не показывается... 1.lib/font.ttf - Должна быть папка со шрифтом на сайте?
Добавить комментарий
Просмотров: 34804