ALCAPTCHA — всё оказалось гораздо серьёзнее!


Alcaptcha - ничего общего с алкоголем
Прошло не мало времени с тех пор, как я сделал библиотеку ALCAPTCHA для CodeIgniter. Я уже успел сделать пару проектов с её использованием, и вот я попал на ресурс http://captcha.ru.

Внимательно изучив этот ценный ресурс я понял, что есть ряд моментов в моей библиотеке, которые я не учёл, потому что и не знал. А библиотека нужная, и, судя по количеству скачиваний, не только мне. Поэтому выпускаю релиз исправлений. Пока я не стал мудрить с номерами версий.

СКАЧАТЬ ALCAPTCHA (с примером) (всего скачали раз)

Изменены следующие вещи:

  1. Генерация случайного кода теперь выполняется в процедуре показа картинки. Теперь не нужно отдельно вызывать функцию генерации года
  2. Рисунок капчи существенно изменён. Теперь убраны шумы и добавлено искажение. Его теперь легче прочитать и в то же время труднее взломать. Алгоритм искажения опять же взят на http://captcha.ru
  3. Изменена переменная в сессии, используемая для хранения кода. Теперь ей трудно совпасть с пользовательской переменной

Как пользоваться библиотекой

Поскольку изменился набор функций — изменилась работа с библиотекой.

Инсталляция

Достаточно скопировать файл alcaptcha.php в папку application/libraries. Подразумевается что в PHP на вашем сервере должна работать библиотека GD.

Кроме того в вашем приложении должна быть загружена библиотека session.
Всё. Инсталляция закончена.

Описание библиотеки

У библиотеки нам понадобятся только 2 функции

  • image() — функция генерирующая изображение капчи. Код капчи генерируется тут же и записывается в сессию.
  • check($code) — функция проверки правильности введённого кода.

Использование для простых форм

Последовательность действий примерно следующая:

  1. Загрузить библиотеку. Например в конструкторе контроллера
    $this->load->library('alcaptcha');
  2. В контроллере создадим функцию рисования капчи. В ней сделаем вызов функции из библиотеки:
        function captha_img($fiction_param) {
            echo $this->alcaptcha->image();
        }

    Во избежание кеширования, у функции рекомендую вводить случайный неиспользуемый параметр

  3. Отобразить рисунок на форме и ввести поле для ввода капчи. Например так:
    Введите капчу: 
    >
  4. Собствено и всё! Осталось проверить капчу на приёме:
    if ( $this->alcaptcha->check($this->input->post('captchacode'))) {
          echo "Введена правильная капча";
    }else {
          echo "Введена неправильная капча";
    }

Готово.

Использование для форм с AJAX

Последовательность действий немного усложняется. Для начала нужно установить XAJAX на свой CodeIgniter. Подробно инсталляция описана здесь. Далее по порядку:

  1. Загрузить библиотеку alcaptcha. (см. выше п.1)
  2. В контроллере нужно создать функцию рисования капчи.(см. выше п.2). Кстати, при использовании AJAX кеш броузера начинает делать своё чёрное дело, и тут случайный и неиспользуемый параметр окажется нам ещё более кстати!!
  3. В конструкторе контроллера загрузить библиотеку xajax и инициализировать её.
    $this->load->library('xajax');
    $this->xajax->registerFunction(
        array('refresh_captcha',&$this,'refresh_captcha')
        );
    $this->xajax->processRequest();
    

    В нашем примере мы назвали ajax-функцию refresh_captcha. В вашем случае функция может называться по-другому.

  4. Теперь займёмся отображением формы. Сначала нужно в заголовочной области подключить скрипты xajax
    xajax->getJavascript('/')?>

    В моём примере скрипты находятся в корневом каталоге сервера.

  5. Внедряем в форму рисунок и поле для ввода капчи. например так:
    
    
    
    обновить капчу Введите код подтверждения:
  6. Где вместо xxxxxx — подставьте имя вашего контроллера.

    Реализовать ajax-функцию. В ней нужно заново сгенерировать код и перегрузить изображение.
    Например так:

        function refresh_captcha() {
            $objResponse = new xajaxResponse();
            $objResponse->Assign("captchaimg","innerHTML", "");
            return $objResponse;
        }
    
  7. Точно так же как и прежде — проверяем правильность введённой капчи. (см. выше п.4)

ALCAPTCHA — всё оказалось гораздо серьёзнее!: 4 комментария

  1. Dreamer

    Слушай, а зачем такие сложности, ещё и xajax подключать. Ведь с помощью JavaScripta можно по нажатию на обновление капчи просто обновлять src. Если кому интересно могу показать.

  2. altesack Автор записи

    От примера не откажусь.
    Просто у меня не получалось почему-то

  3. Dreamer

    При клике на кнопку вызываем функцию.
    function update_captcha() {
    $(‘#captcha’).attr(‘src’, url/create_captcha/’+Math.random()+’.jpg’);
    }
    У меня используется jquery, но найти как с помощью JavaScript установить атрибут не сложно.
    Точно не помню но что-то воде document.getElementById(‘id’).setAttribute(‘src’, ‘url/create_captcha/’+Math.random()+’.jpg’).
    Причём при попытке открыть рисунок открывается другая капча. Так что насколько я понимаю(хоть никогда не пробовал ломать капчи) для роботов это дополнительная трудность.

  4. Игорь

    Спасибо за библиотеку!!! Так быстро капчи еще не ставил на сайт))

Комментарии запрещены.