Pull to refresh

Проверка CAPTCHA

Reading time 2 min
Views 7.7K
В этой статье я расскажу о нескольких способах проверки поля CAPTCHA в html формах.

Думаю, объяснять, что такое CAPTCHA, смысла не имеет, поэтому сразу перейдем к ее использованию.

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

Наибольшее распространение получили CAPTCHA использующие рисунки с искаженным текстом. Но в последнее время все чаще появляются альтернативные варианты, предлагающие посетителю ответить на какой-то вопрос или выполнить определенное действие (например, выбрать картинку из нескольких предложенных).

Какой бы из этих способов вы не выбрали, принцип работы с CAPTCHA остается неизменным.

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

Более наглядно этот процесс показан на рисунке.

алгоритм работы с captcha

Наибольший интерес здесь представляют две операции:
1. сохранение данных CAPTCHA;
2. проверка полученного от посетителя значения.

Существуют три основных способа сохранения данных CAPTCHA.
1. с помощью скрытых полей формы;
2. с помощью сессий;
3. с помощью базы данных.

Примечание. Под данными CAPTCHA я подразумеваю: правильный ответ, путь к изображению (если оно используется), идентификатор посетителя (если нужен).
Первый вариант самый незащищенный. По-сути, вы отправляете посетителю правильный ответ, а для спамерских ботов работа со скрытым полем формы ничем не отличается от работы с обычным.

Главное преимущество такого метода – простота реализации. Нужно просто сравнить значения двух полей формы (скрытого и заполненного посетителем).
Сохранение данных в сессии предоставляет более высокий уровень безопасности.

Правильные ответы хранятся на сервере и недоступны посетителям. Кроме того, в этом случае легко ограничить "срок жизни" CAPTCHA, просто задав "срок жизни" сессии.

Правда тут возникает небольшая проблема. Представьте, что вы создали CAPTCHA, которая использует изображения с текстом. Эти изображения создаются при каждом обращении к форме и сохраняются в какой-нибудь папке.

Что произойдет с этими файлами если сессия будет просрочена? Ответ – ничего. Они будут скапливаться, и занимать место. Т.е. нужен скрипт, периодически удаляющий устаревшие файлы.

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

Главный недостаток по сравнению с сессиями – необходимость отличать одного посетителя от другого. Для этого можно использовать его IP адрес (или комбинацию IP адреса и данных браузера (например, использовать заголовок User-Agent)).

Таким образом, для хранения данных CAPTCHA можно использовать таблицу с такими полями:

captcha_id – первичный ключ;
captcha_time – время создания CAPTCHA;
ip_address – адрес посетителя;
captcha_text – текст, написанный на рисунке;
pic_name – имя рисунка.

В этом случае для получения данных CAPTCHA можно использовать запрос следующего вида:

SELECT COUNT(*) AS count FROM captcha WHERE word = $userValue AND ip_address = $userIP AND captcha_time > $expTime

Преимущество по сравнению с сессиями – не нужны скрипты удаления рисунков (достаточно простого SQL запроса).

Полный пример реализации такой CAPTCHA на php приведен в статье: «Добавляем CAPTCHA к форме».
Также можно посмотреть live demo.
Tags:
Hubs:
+1
Comments 32
Comments Comments 32

Articles