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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 снова отправляется в поиски за новым материалом. Удачи и вам icon smile Капча спасает мир





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



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

  1. Eugeo
    Июль 9th, 2008

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

  2. Саша Бронин
    Июль 9th, 2008

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

  3. novice
    Июль 9th, 2008

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

  4. Skill00
    Июль 10th, 2008

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

  5. novice
    Июль 10th, 2008

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

  6. Eugeo
    Июль 11th, 2008

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

  7. Skill00
    Июль 11th, 2008

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

  8. novice
    Июль 11th, 2008

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

  9. Skill00
    Июль 14th, 2008

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

  10. novice
    Июль 14th, 2008

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

  11. Алекс
    Сентябрь 16th, 2008

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

  12. Александр
    Февраль 10th, 2009

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

  13. Victor
    Май 19th, 2009

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

  14. novice
    Май 19th, 2009

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

  15. metaluga
    Август 8th, 2009

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

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

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

  16. novice
    Август 9th, 2009

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

Оставить комментарий


© 2008 - 2012 i-novice.net | Все права защищены.