Прошло не мало времени с тех пор, как я сделал библиотеку ALCAPTCHA для CodeIgniter. Я уже успел сделать пару проектов с её использованием, и вот я попал на ресурс http://captcha.ru.
Внимательно изучив этот ценный ресурс я понял, что есть ряд моментов в моей библиотеке, которые я не учёл, потому что и не знал. А библиотека нужная, и, судя по количеству скачиваний, не только мне. Поэтому выпускаю релиз исправлений. Пока я не стал мудрить с номерами версий.
СКАЧАТЬ ALCAPTCHA (с примером) (всего скачали 1222 раз)
Изменены следующие вещи:
- Генерация случайного кода теперь выполняется в процедуре показа картинки. Теперь не нужно отдельно вызывать функцию генерации года
- Рисунок капчи существенно изменён. Теперь убраны шумы и добавлено искажение. Его теперь легче прочитать и в то же время труднее взломать. Алгоритм искажения опять же взят на http://captcha.ru
- Изменена переменная в сессии, используемая для хранения кода. Теперь ей трудно совпасть с пользовательской переменной
Как пользоваться библиотекой
Поскольку изменился набор функций – изменилась работа с библиотекой.
Инсталляция
Достаточно скопировать файл alcaptcha.php в папку application/libraries. Подразумевается что в PHP на вашем сервере должна работать библиотека GD.
Кроме того в вашем приложении должна быть загружена библиотека session.
Всё. Инсталляция закончена.
Описание библиотеки
У библиотеки нам понадобятся только 2 функции
- image() – функция генерирующая изображение капчи. Код капчи генерируется тут же и записывается в сессию.
- check($code) – функция проверки правильности введённого кода.
Использование для простых форм
Последовательность действий примерно следующая:
- Загрузить библиотеку. Например в конструкторе контроллера
1
$this->load->library('alcaptcha');
- В контроллере создадим функцию рисования капчи. В ней сделаем вызов функции из библиотеки:
1 2 3
function captha_img($fiction_param) { echo $this->alcaptcha->image(); }
Во избежание кеширования, у функции рекомендую вводить случайный неиспользуемый параметр
- Отобразить рисунок на форме и ввести поле для ввода капчи. Например так:
1 2 3
Введите капчу: <img src= <?=site_url('xxxxxxx/captha_img/'.rand(0,255))?>><br> <input type='text' name='captchacode'>
- Собствено и всё! Осталось проверить капчу на приёме:
1 2 3 4 5
if ( $this->alcaptcha->check($this->input->post('captchacode'))) { echo "Введена правильная капча"; }else { echo "Введена неправильная капча"; }
Готово.
Использование для форм с AJAX
Последовательность действий немного усложняется. Для начала нужно установить XAJAX на свой CodeIgniter. Подробно инсталляция описана . Далее по порядку:
- Загрузить библиотеку alcaptcha. (см. выше п.1)
- В контроллере нужно создать функцию рисования капчи.(см. выше п.2). Кстати, при использовании AJAX кеш броузера начинает делать своё чёрное дело, и тут случайный и неиспользуемый параметр окажется нам ещё более кстати!!
- В конструкторе контроллера загрузить библиотеку xajax и инициализировать её.
1 2 3 4 5
$this->load->library('xajax'); $this->xajax->registerFunction( array('refresh_captcha',&$this,'refresh_captcha') ); $this->xajax->processRequest();
В нашем примере мы назвали ajax-функцию refresh_captcha. В вашем случае функция может называться по-другому.
- Теперь займёмся отображением формы. Сначала нужно в заголовочной области подключить скрипты xajax
1
<head><?=$this->xajax->getJavascript('/')?></head>
В моём примере скрипты находятся в корневом каталоге сервера.
- Внедряем в форму рисунок и поле для ввода капчи. например так:
1 2 3 4 5 6 7 8 9
<tr> <td></td> <td><div id='captchaimg' > <img src="<?=site_url('xxxxxxx/captha_img/'.rand(0,255))?>"> </div><a href='#' onclick=' xajax_refresh_captcha()'>обновить капчу</a></td> </tr><tr> <td>Введите код подтверждения:</td> <td><input type="text" name="captchacode"></td> </tr> - Точно так же как и прежде – проверяем правильность введённой капчи. (см. выше п.4)
Где вместо xxxxxx – подставьте имя вашего контроллера.
Реализовать ajax-функцию. В ней нужно заново сгенерировать код и перегрузить изображение.
Например так:
1 2 3 4 5 | function refresh_captcha() { $objResponse = new xajaxResponse(); $objResponse->Assign("captchaimg","innerHTML", "<img src='".site_url('usingcaptcha/captha_img/'.rand(0,255))."'>"); return $objResponse; } |
Посты по теме:
RSS-подписка
Слушай, а зачем такие сложности, ещё и xajax подключать. Ведь с помощью JavaScripta можно по нажатию на обновление капчи просто обновлять src. Если кому интересно могу показать.
От примера не откажусь.
Просто у меня не получалось почему-то
При клике на кнопку вызываем функцию.
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’).
Причём при попытке открыть рисунок открывается другая капча. Так что насколько я понимаю(хоть никогда не пробовал ломать капчи) для роботов это дополнительная трудность.
Спасибо за библиотеку!!! Так быстро капчи еще не ставил на сайт))