воскресенье, 15 февраля 2009 г.

Прикручиваем капчу к форме регистрации в joomla

Как то повадился один робот регать пользователей на один из моих сайтов. О том что это робот можно было догадаться по манере заполнения регистрационных данных, все телефоны состояли из цифр "1234567", а электронный адрес почему то был всегда имяпользователя@gmail.com.

Большого вреда это не приносило но база с данными засорялась и вводила в заблуждение менеджера который следит за посещаемостью сайта.

Решено приделать капчу к форме регистации, для настоящих подписчиков это не очень большое неудобство а от роботов какая ни есть а защита.

Написать капчу самостоятельно можно, но не нужно. Нет, конечно если в этом цель то конечно стоит ее написать самому.

Ну в общем желающие писать самому могут уже начинать а те кто готов использовать готовое решение продолжают читать далее.

В качестве готовой капчи я взял решение с сайта http://www.captcha.ru/

Качаем архив и начинаем разбираться.

Из полученного архива распаковываем файлики в директорию джумлы - components/com_registration

Файлик index.php переименовываем в cap.php. Зачем? А подумайте, а зачем нам в com_registration файл по имени index.php?

Для начала добавляем в registration.html.php следующие строки
 <img src="cap.php"> 
- это будет наша сгенерированая картинка
 <input type="text" name="keystring"> 
а сюда пользователь будет вводить текст что увидит на картинке.

Куда добавлять? Сказать вам номер строки? Нет не скажу, тогда вам и думать не надо будет, а это плохо влияет на моцк. Засыхает он. :-)

Одним словом добавлять надо в форму регистрации пользователя. Если вы хотите закрыть капчей еще и форму востановления пароля то нет проблем, можно добавить и туда.

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

Ну едим дольше, теперь модифицируем файлик registration.php. тут немного надо посоображать.

И так начнем соображать от того момента как будет выводится в браузер содержимое файла registration.html.php. Допустим пользователь решил зарегистрироваться, ему в браузер выводится форма регистрации, когда парсер дойдет до строки с будет запушен на исполнение файла cap.php. Он сформирует изображение из буквенноцифрового кода а сам код будет записан в сессию.

Далее пользователь заполняет поля и вводит код который видит на картинке, нажимает кнопку сабмит и данные из формы уходят на сервер.

Анализ того что ввел пользователь происходит в файле registration.php.

Для начала стартуем сессию

session_start();


Проверяем равна ли переменная $task значению saveRegistration если да то проверяем существует ли в сессии переменная captcha_keystring и равна ли она тому что ввел пользователь в форме ($_POST['keystring'])?

Если это условие не выполняется то переменной $task присваиваем значение register и пользователь опять отправляется на регистацию. :-)

if($task=="saveRegistration"){
if(!(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring'])){
$task = "register";
}
}

да и незабываем уничтожить переменную
unset($_SESSION['captcha_keystring']);


Ну вот собственно и все!

Можно еще приделать механизм обновления картинки, потому как иногда она нечитаема даже для людей, не говоря уже о роботах.

Но это мы сделаем в другой раз!

3 комментария:

Анонимный комментирует...

огромное спасибо!

Spilberg комментирует...

Надо же, кому то помогло, очень рад.

Анонимный комментирует...

Спасибо! Отличная статья! Нужная и актуальная!
А когда появится статья о механизме обновления рисунка captcha? Антон.