CAPTCHA на PHP

php, web-розробка Автор: Роман Голубовський

Теги : , , , , ,

Виявляється, далеко не всі знають, що таке c.a.p.t.c.h.a. Мій знайомий недавно мене запитав, для чого на веб-сайтах, – особливо коли щось треба скачати чи опублікувати коментар, – потрібно ввести цифри з картинки, які до того ж так погано видно. Отож ліквідація безграмотності – зараз спробую пояснити, що значить картинка з цифрами, і далі розкажу, як зробити captcha з допомогою PHP. Хто теоритично готовий – може переходити зразу до технічної частини.

Отож, згідно вікіпедії, CAPTCHA (англ. “completely automated public Turing test to tell computers and humans apart” — повністю автоматизований публічний тест Тюринга для розрізнення комп’ютерів і людей) — торгова марка Університету Карнегі-Меллона, комп’ютерний тест, який використовується для того, щоб визначити, хто використовує систему — людина чи комп’ютер. Термін з’явився у 2000 році.

У більшості випадків captcha – це така невеличка картинка з набором букв і цифр, які потрібно ввести в полі вводу, розташованого поряд. При правильному вводі відбувається певна дія (наприклад скачування файлу або публікація коментаря), при неправильному – пропонується ввести циферки ще раз. Це робиться для того, щоб впевнитись, що циферки вводить саме людина а не зла компютерна програма, спам-бот. Цифри важко прочитати – це робиться спеціально для того, щоб і компютерній програмі було важче просканувати цифри на малюнку. Загалом капчі не обмежуються лише картинками. Зустрічаються captcha у вигляді загадок, прохань доповнити фразу або легкі арифметичні задачі (1 + 2 = *) – завдання, які зазвичай без найменших проблем вирішуються звичайними людьми, зате не вирішуються не підготовленими спеціально для цього програмами. Наприклад, хіба важко доповнити таке (ввести те, що має бути на місці трьох крапок):
“Столиця Сомалі – …”
Жартую. Це повинне бути щось дійсно легке, таке, як, наприклад, “Д’Артаньян і … мушкетери”. (Кому все ж цікаво, столиця Сомалі – Могадішу:)

Але ми зараз розглядаємо капчу в її класичному вигляді, тобто як малюнок. Тому приступимо до створення captcha з допомогою PHP.

Спочатку скрипт який генерує малюнок з циферками (captcha.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 
// Вказуєм браузеру в хедерах що наш малюнок не потрібно кешувати
Header("Pragma: no-cache");
 
// Знову в хедерах вказуємо, що ми виводимо саме малюнок
Header("Content-type: image/jpeg");
 
// Берем малюнок для бекграунда
$pic = ImageCreateFromjpeg("captcha.jpg");
 
// Вказуємо колір наших циферок
$color = ImageColorAllocate($pic, 249, 207, 180);
 
// Беремо довільний код, який і виведем на малюнку (в нашому випадку 4 цифри)
$code = '';
for($i = 0; $i < 4; $i++) {
	$code .= rand(0, 9);
}
 
// Ну і нарешті малюємо малюнок
ImageString($pic, 6, 23, 13, $code, $color);
Imagejpeg($pic);
ImageDestroy($pic);
 
?>

Тепер визиваєм цей скрипт як звичайний малюнок, який вставляєм в нашу хтмл-сторінку:

1
2
3
4
5
6
7
8
<html>
<head>
	<title>Captcha</title>
</head>
<body>
	<img src=”captcha.php” />
</body>
</html>

Врезультаті на сторінці зявляється малюнок з довільними цифрами, що змінюються при кожному завантаженні сторінки:

Ну ось, основна частина, яка показує як саме зробити captcha-малюнок, зроблена. Тепер залишилось показати приклад застосування. Для цього ми трошки змінем файл captcha.php та створимо файл captcha_test.php для прикладу роботи капчі.

captcha.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
// Відкриваємо сесію – потрібно буде для передачі цифр в скрипт для перевірки
session_start();
 
// далі все як було
Header("Pragma: no-cache");
Header("Content-type: image/jpeg");
 
$pic = ImageCreateFromjpeg("captcha.jpg");
$color = ImageColorAllocate($pic, 249, 207, 180);
$code = '';
for($i = 0; $i < 4; $i++) {
	$code .= rand(0, 9);
}
ImageString($pic, 6, 23, 13, $code, $color);
Imagejpeg($pic);
ImageDestroy($pic);
 
// Код записуємо в змінну сесії
$_SESSION['submit_code'] = $code;
 
?>

Ми модифікували файл captcha.php таким чином, щоб він крім виводу малюнку ще й записував в змінну сесії цифри, що показуються на малюнку. Саме зі змінною сесії будуть порівнюватись введені користувачем дані. Це досить безпечний метод, адже доступ до змінних сесії мають лише наші скрипти. Йдемо далі. Файл captcha_test.php буде виводити малюнок капчі, поле для вводу цифр, текст з прозьбою це зробити і кнопку сабміту. При натисненні на кнопку скрипт перевіряє, чи введені цифри аналогічні тим, які збережені файлом капчі у змінній сесії. Якщо цифри збігаються – виводиться привітання, якщо ні – повідомлення про помилку і просьба спробувати ще. Менше слів, дивимся:

Captcha_test.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
// Не забуваєм відкрити сесію, інакше нічого не вийде
session_start();
?>
<html>
<head>
	<title>Captcha</title>
</head>
<body>
<?php
 
// якщо дані з форми передані
if(isset($_POST['code'])) {
 
	// якщо введені дані аналогічні зі збереженими в сесії - вивід повідомлення з привітанням
	if(isset($_SESSION['submit_code']) && ($_SESSION['submit_code'] == $_POST['code'])) {
		echo 'Вітаю! Код введений вірно.';
	}
 
	// інакше вивід повідомлення про помилку
	else {
		echo 'Код введений невірно. <a href="">Спробуйте ще</a>';
	}
}
else { // малюнок з цифрами і форма для вводу цифр
?>
 
<img src="captcha.php">
<br />
Введіть будь-ласка цифри з картинки:
<form action="" method="POST">
	<input type="text" name="code" />
	<br />
	<input type="submit" value="Ok" />
</form>
 
<?php
}
?>
</body>
</html>

При запуску в браузері нашого скрипта все виглядатиме приблизно ось так:

captcha with php

Як бачите, нічого складного немає. От і все, тепер ми знаємо як створювати captcha на php. Успіхів в освоєнні інтернет-технологій!

Схожі статті

Коментарі:

Коментувати