Створення каптчі на PHP за допомогою класу TCaptcha з бібліотеки SNK GSCP

Нові матеріали

Створення каптчі на PHP за допомогою GSCP

У процесі підготовки форуму, очевидним чином постало питання про створення форми реєстрації. А за традицією, що склалася, в такій формі завжди є каптча — картинка з набором символів, які пропонується ввести в текстове поле введення.

Примітка Саме поняття каптчі з'явилося від CAPTCHA, що є абревіатурою Completely Automated Public Turing Test to Tell Computers and Humans Apart. У перекладі з англійської — «цілком автоматизований публічний тест Тьюринга для розрізнення комп'ютерів і людей», або ПАПТРКЛ. Проте український переклад абревіатури важко вимовляти, і тому використовується калька з англійської, причому іноді буква Т заради милозвучності пропадає і виходить просто «капча».

Сам генератор каптчі, до речі, вже був у розпорядженні - клас TCaptcha був реалізований ще у версії 1.5 PHP-бібліотеки GSCP. Тепер залишилося зробити 2 речі: використовувати генератор картинки-каптчі і зробити так, щоб її можна було перевірити.

Створення CAPTCHA за допомогою PHP

Насамперед нам знадобиться GSCP версії 1.5 або вище (використовуємо щойно вийшов реліз-кандидат 1.6). Завантажуємо архів зі скриптами та підключаємо до свого скрипту, який назвемо captcha_image.php потрібний PHP-файл - captcha.php:

Власне, 99% роботи щодо генерації картинки для капчі зроблено, залишилося лише створити екземпляр класу і налаштувати параметри гнерації зображення. У таблиці нижче наведено основні властивості класу Tcaptcha.

Властивість Тип даних Опис
$ctextРядокТекст для каптчі. Використовується для запису, якщо ви бажаєте використовувати власні варіанти, а не автоматично генеровані послідовностісимволів і для читання - після роботи генератора (метод GenerateText())
$symbolsМасивМасив символів, у тому числі генерується рядок для каптчи. За замовчуванням вказані всі цифри та букви латиниці, крім нуля та букв «I» та «О» - щоб уникнути плутанини
$minlengthЦіле число >0Мінімальна кількість символів у каптчі. Типово 5.
$maxlengthЦіле число >0Максимальна кількість символів у каптчі. Типово 7.
$bgcolorКолір у 16-річному форматіКолір заливки фону для каптчі (якщо не використовується фоновий малюнок). За промовчанням 0xffffff.
$fontcolorКолір у 16-річному форматіКолір шрифт. За промовчанням 0xffffff.
$fontsizeЦіле число >0Розмір шрифту. За замовчуванням 2 (середній системний), якщо вказано шрифт (див. fontname), слід вказати розмір від 9-10 і вище.
$fontnameРядокІм'я файлу зі шрифтом TTF. За промовчанням не визначено, використовується вбудований GD-шрифт.
$wavesЦіле число від 0 до 3Хвильові спотворення тексту в каптчі: 0 - ні, 1 - по горизонталі, 2 - по вертикалі, 3 - по обох осях. За замовчуванням 1.
$linesЦіле число від 0 до 3Штрихи. 0 – ні, 1 – кольором фону, 2 – кольором тексту, 3 – обидва. Типово 0.
$angleЦіле числоПоворот у градусах. Типово використовуйте не більше +/- 2-3 градуси для прямокутної каптчі. Типово 0.
$width, $heightЦіле число >0Ширина та висота малюнка, відповідно. У пікселях. Типово 130 на 50.

Власне, достатньо написати 3 маленькі рядки коду:

$ c = New Tcaptcha (); $c->GenerateText(); $c->Make();

І цього буде достатньо, щоб отримати зображення-капчу розмірами 50 на 130 пікселів, що складається з 5-7 символів та помірно стійку до злому. Втім, можна дещо ускладнити (або навпаки, спростити) каптчу, змінити її розміри, тло, колір та гарнітуру шрифту. Щоправда, в останньому випадку знадобиться встановлена ​​на стороні хостера підтримка ImageMagick з усіма витікаючими (підтримка TTF-шрифтів тощо). Якщо все це є, то можна використовувати для своєї каптчі, скажімо, шрифт Arial з напівжирним зображенням. У такому випадку можна встановити ще й розмір шрифту та з іншими властивостями поекспериментувати. Для цього між створенням екземпляра класу ($c = new Tcaptcha();) та викликом методу генерації тексту ($c->GenerateText();) можна вставити наступні рядки:

$c->fontname = "../arialbd.ttf"; // встановлюємо шрифт $c->fontsize = 18; //встановлюємо розмір шрифту $c->fontcolor = 0xa0040f; //встановлюємо колір шрифт $c->bgcolor = 0xfeecca; //встановлюємо фоновий колір каптчі $c->angle = -2; // встановлюємо кут повороту тексту $c->waves = 1; // хвильові спотворення нехай залишаться по горизонталі $c->lines = 2; // заштрихуємо кольором тексту $c->minlength = 6; // У цьому та наступному рядках встановлюємо фіксоване число символів у каптчі - 6 $c->maxlength = 6;

І ви побачите свою капчу.

Використання каптчі для перевірки форм

$frm = new TStdLoginForm(NULL, "authfrm", "check.php", 11, "Введіть логін, пароль та символи з картинки: ");

Суть цього зводиться до генерації наступного HTML-коду:

Тобто. створюється форма з ім'ям authform, методом відправки POST, якуоброблятиме скрипт check.php. У самій формі є поля для введення логіну, пароля, символів з каптчі, а також кнопка відправки.

Створивши тим чи іншим способом форму, що містить поле для введення символів з каптчі (а також не забувши вивести саме зображення), залишиться вирішити лише одну проблему: як перевірити відповідність зображення на картинці та відповіді користувача? Насправді, способів безліч. Головне не помилитись. Найперше місце по дурості займає пряме відправлення згенерованого тексту у форму (скажімо, у вигляді прихованого input). Не набагато краще і спосіб, який завзято пропонується на десятках блогів у рунеті, що вперто вилазять у перших рядках пошуку на запит CAPTCHA: передача через сесію. Начебто не видно, і добре. Насправді – видно, боти чудово можуть отримати значення з cookie, сесій тощо. Тому якщо вже й використовувати зберігання у сесії, то не самої відповіді, а його хеша.

В результаті на початку скрипта captcha_image.php слід починати сесію (session_start();), а безпосередньо перед виведенням самої картинки - зберігати в сесії MD5-зліпок тексту з каптчі. У результаті отримуємо остаточний варіант свого скрипта — його повний вихідний код.

Файл captcha_image.phpfontname = "../arialbd.ttf"; // встановлюємо шрифт $c->fontsize = 18; //встановлюємо розмір шрифту $c->fontcolor = 0xa0040f; //встановлюємо колір шрифт $c->bgcolor = 0xfeecca; //встановлюємо фоновий колір каптчі $c->angle = -2; // встановлюємо кут повороту тексту $c->waves = 1; // хвильові спотворення нехай залишаться по горизонталі $c->lines = 2; // заштрихуємо кольором тексту $c->minlength = 6; // У цьому та наступному рядках встановлюємо фіксоване число символів у каптчі - 6 $c->maxlength = 6;$c->GenerateText(); $_SESSION["captcha"]=MD5($c->ctext); $c->Make(); ?>

Тут ми створили малюнок та зберегли у сесії хеш правильної відповіді. Тепер достатньо отримати значення поля captcha з форми, зробити з нього MD5 зліпок та порівняти їх. У прикладі обробкою форми займається скрипт check.php. Для простоти ми опустимо перевірку логіна-паролю (тим паче, що по-хорошому це треба робити вже після перевірки каптчі). Отримуємо приблизно таке:

В умовному операторі додатково перевіряється, чи не порожні рядки порівнюються. У принципі це все. Єдине, що слід враховувати – так це те, що до 3-4 символьного терміну, що складається лише з букв і цифр (у нашому випадку навіть не всіх), MD5-хеш можна підібрати за прийнятний час навіть на PHP. Тому використовуйте не менше 6 символів або взагалі передавайте лише ідентифікатор сесії, а відповідь зберігайте у себе на сервері в базі даних. Це трохи складніше і трохи накладніше, зате надійніше.