Капча спасает мир

Честно говоря, когда меня попросили написать статью про captch`у, я подумал что, это будет небольшой пост, где я покажу, как ее можно использовать у себя на сайте.

Но как только я начал собирать информацию по этому вопросу в Интернете я сделал для себя много интересных открытий и понял, что тема капчи достойна более пристального внимания. Даже если цель будет иметь чисто общеобразовательный характер, советую вам прочитать статью полностью :)

Итак, начнем с определения.
CAPTCHA - это аббревиатура от английских слов “Completely Automatic Public Turing Test to Tell Computers and Humans Apart” (переводится как “полностью автоматический тест Тьюринга для различения компьютеров и людей”).

Самым частым применением этого теста является защита от флуда. С помощью этого теста можно определить, например, заполнил форму человек или скрипт.

Реализовывается капча в большинстве случаев в виде картинке с надписью. А рядом с картинкой поле для ввода, куда требуется ввести то, что на картинке написано. Человек с этой задачей справится без труда, а скрипту придется очень тяжко :)

Пример капчи:

Узнать что нарисовано на капче программным способом - задача не из легких, но, несмотря на это, способ все-таки был найден. В основу этого способа положено предположение о том, что на капче написан обычный текст известного языка.

В этом случае задача сводится к его распознаванию.
Распознавание капчи происходит в два этапа:

  1. определение местоположения символов (знакомест)
  2. определение самих символов (что за буква там собственно :) ).

Первый шаг решается через определение областей контрастных с фоном.
Второй – через сравнение каждого символа со всеми возможными символами (в идеале) всех известных шрифтов. Для каждой пары (распознаваемый символ и текущий с которым сравнивается) вычисляется какое-то значение, величина которого определяет сходство. И затем выбирается тот символ, для которого эта величина максимальна (самый похожий).

Но, в то время пока изобретались все новые алгоритмы распознавания капчи, создатели самих капч тоже не спали и придумывали все новые способы усложнить жизнь первым :)

А проблемы эти можно создать на обоих этапах.
Первый этап (определение знакомест) можно усложнить, меняя каждый раз координаты отображения символов.

Для усложнения второго этапа есть несколько способов:

  1. не делать цвет фона контрастным с цветом шрифта (использовать шут цвета шрифта)
  2. частично накладывать буквы друг на друга, чтобы они пересекались (это усложнит определение границ буквы).
  3. создать шум в виде полосок цвета букв, пересекающий сами символы.
  4. использовать всегда разные шрифты, а лучше применять геометрические искажения для шрифтов.

Если вы не хотите писать капчу самостоятельно, то все вышеизложенное поможет вам выбрать надежную каптчу для вашего проекта. Выглядеть она может, например, так:

Здесь одновременно используется смена местоположения знакомест, слияние символов и геометрическое искажение шрифтов.

Ну, теории, пожалуй, достаточно – перейдем к практике.
Библиотек, которые реализуют подобные капчи достаточно, но работают все по одному алгоритму:

  1. Генерируется строка, которая будет потом переведена на картинку.
  2. Строка сохраняется в переменной сессии.
  3. После ввода пользователем значения в input, оно сравнивается со строкой их сессионной переменной.

Этот алгоритм исключает возможность того, что удаленный скрипт получит значение изначальной строки.

В своем примере я буду использовать библиотеку KCaptcha.

Index.php

<?
    session_start();

    $keystring = $_REQUEST['keystring'];

    include 'form.html';
   
    if (!empty($keystring)) {

        if ($keystring != $_SESSION['captcha_keystring']) {
            echo 'Incorrect';
        } else {
            echo 'Correct';
        }
    }
?>

Form.html

<form action="index.php" method="post">
<p>Enter text shown below:</p>
<p></p>
<p><a href="#" onClick="document.getElementById('image').src='img.php?rand='+Math.round(1000 * Math.random());">Refresh</a></p>
<p><input type="text" name="keystring"></p>
<p><input type="submit" value="Check"></p>
</form>

Img.php

<?php

session_start();

include('kcaptcha.php');

$captcha = new KCAPTCHA();

$_SESSION['captcha_keystring'] = $captcha->getKeyString();

?>

Кстати говоря, обратите внимание на работу кнопки Refresh – она отправлет скрипту img.php в качестве параметра случайное число, что не позволяет браузеру показывать всегда одну и ту же кэшированную картинку.

И не забывайте про настройки, которые в kcaptcha довольно гибкие.

Ну вот и все. Novice снова отправляется в поиски за новым материалом. Удачи и вам :)





Читайте также:



16 Ответов на “Капча спасает мир”

  1. Еще сейчас частенько попадаются капчи с вводом только определенных символов, арифметическими действиями и т.п.
    Поискал в закладках и нашел это:
    [ссылка]
    Главное до такого не докатиться)).

  2. Ну у вас либо талант писать, либо это стыбрено! :)

  3. novice

    2 Eugeo : с формулой из матана - это, конечно, жестко 😀
    2 Саша Бронин : Стараюсь, практикуюсь, изо дня в день совершенствую свои навыки :)

  4. Интересно, как рапидшара генерила свои дурацкие капчи с кошками (сейчас вроде их уже нету).
    Хочешь подскажу тему для следующих выпусков? “Как самому сделать распознавалку капчи” :).
    P.S. Интересный материал

  5. novice

    Хммм. Задачка не из простых.. А хотя попробую. :) Спасибо за идею.

  6. Даешь распознавалку для капчи! ))

  7. Кстати, на 4seo.biz был довольно неплохо расписан пример распознавания одной капчи именно на php.

  8. novice

    Жалко только что форум закрытый. Если есть возможность - скинь инвайт плз на . Похоже, что форум полезный очень.

  9. Почту проверь :)

  10. novice

    2 Skill00: Спасибо! :)

  11. Отличная статья, спасибо автору. Мне сильно помогла, когда я начал делать капчу с нуля, не имея даже понятия, что она из себя представляет и как её делать.

  12. Спасибо реально пригодилось.

  13. Victor

    А библиотеку KCaptcha.php гдевзять можно подскажите??

  14. novice

    Тут: [ссылка]

  15. я тебе, админ, подброшу как раз тему для исследования.
    я сам не знаю но очень хочу знать - как считать номер жд пользователя?
    такое существует - я проверял.
    1)нашел сайт на dle(движок).
    2)взял анонимную проксю
    3)выругался хорошенько в каменте - фсе маты выложил что знал.

    куки проверил - удалил.
    сменил ип.
    даже сменил анонимную проксю на другую.
    фсе равно - бан!

    значит считали номер жд - КАК?
    я считаю это первоочередной темой для иссследований!

  16. novice

    Скорее всего считывание серийного номера HDD было реализовано через ActiveX или Java-апплет. Через PHP сомневаюсь, что это возможно реализовать.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map