30
CAPTCHA на PHP
web-розробка Автор: Роман Голубовський
Теги : captcha, HTML, 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 на php. Успіхів в освоєнні інтернет-технологій!
Свого часу я також цікавився власноручним створенням капч (чи каптч). Навіть змайстрував простеньку капчу – http://vispyanskiy.name/?p=14
Як тобі вона?
Також радив би поцікавитися про захист від спаму без використання капчі. Такого роду скрипти намагаються відрізнити людину від бота за “непрямими” ознаками. Якщо цікаво, то статтю з цього питання можна знайти в мене на блозі.
virua, жовто-блакитна капча взагалі дуже гарна. Щоправда технічно складніша.
Але хотілось би сказати про інше. Раніше, вводячи в google певний запит (той же “captcha на php”), я міг сподіватись лише на російськомовні статті у результатах пошуку, адже україномовних просто не було в наявності. Тепер, завдяки українським блогерам (серед яких і ми з тобою) в інтернет можна знайти інформацію українською, а це вже результат.
Але важливо також, коли стаття з’являється. Так російськомовним статтям про капчі вже по 5 років стукнуло. Оперативність в укр. сегменті шкутильгає
virua, таке ж можна сказати і про російськомовні статті про captcha порівняно з англомовними. Всі колись починають.
[...] Але раптом виявилось, що цифри з картинки (captcha) введено неправильно, а система коментування не [...]
Цікаво – а головне працює.
Але..
Я отримую код кептча тільки після перезавантаження сторінки – а хотілось би використати його в ajax перевірці – відповідно його треба десь зафіксувати в змінній у виді хеш коду чи чогось подібного.
Як його отримати у зміній?
Дякую.