KCAPTCHA — защита от спама
Автор: Paladinovolk | Категория: Сайтостроение Среда 16 Декабрь 2009CAPTCHA — это аббревиатура от английских слов «Completely Automatic Public Turing Test to Tell Computers and Humans Apart» — полностью автоматический тест Тьюринга для различения компьютеров и людей. Иными словами, это задача, которую легко решает человек, но которую невозможно (или крайне трудно) научить решать компьютер.
Применяются CAPTCHA для того, чтобы предотвратить множественные автоматические регистрации и отправления сообщений программами-роботами. Т. е. задача CAPTCHA — защита от спама, флуда и захвата аккаунтов.
Чаще всего CAPTCHA выглядит как тем или иным образом зашумленное случайное число, слово или иная надпись, которую пользователю нужно прочитать и ввести прочитанный результат, хотя существуют и другие алгоритмы.
Алгоритм CAPTCHA-проверки
Кратко рассмотрим алгоритм CAPTCHA-проверки посетителя, сделав упор на защиту от уязвимостей, не связанных с собственно распознаванием картинки:
Пользователь заходит на защищаемую страницу, мы создаем для него сессию. Лучше всего, если эту сессию будет создавать сама CAPTCHA-картинка (вернее, скрипт, которые ее выдает).
Скрипт генерирует случайный текст, записывает его в сессию и выдает картинку с этим текстом посетителю. Потом, при проверке, ответ, введенный посетителем, сравнивается с эталоном, сохраненным в этой сессии.
Важно, чтобы закодированный текст никак не вычислялся из данных, передаваемых браузеру. К примеру, плоха идея хранить текст не в сессии на сервере, а передавать его (пусть даже в кодированном виде) аргументом (через адресную строку или cookie) скрипту-картинке, с тем, чтобы скрипт текст раскодировал и выдал соответствующее изображение — угадать принцип кодирования не так сложно, на самом деле. Потом, если на сервере этот текст не хранится, а передается с запросами, его вполне можно подменить.
Если случайный текст будет генерироваться не при выдаче картинки, а при выдаче страницы с формой, появляется опасность, что бот сделает несколько запросов к скрипту картинки, чтобы получить несколько вариантов одного и того же текста (если картинка выдается со случайными искажениями — то есть разная от раза к разу, хотя и с одним и тем же закодированным текстом). Распознать текст, если есть несколько его вариантов, гораздо проще.
Генерация кода самой картинкой позволяет реализовать функцию «получить другой код, если этот плохо читается пользователем» — будет достаточно обновить только картинку.
Распространенной ошибкой является то, что при проверке правильности введенного текста его просто берут из сессии и сравнивают с ответом посетителя. Проблема в том, что злоумышленник может подсунуть нам номер несуществующей сессии и ввести пустой проверочный текст. И этот пустой текст будет равен пустому тексту из несуществующей сессии — все, заслон пройден.
Важно очищать сессию после каждой проверки (неважно, успешной или нет). Не стоит полагаться на то, что при обновлении страницы скрипт картинки сгенерит новый текст — бот может просто не запрашивать картинку, а вводить один и тот же ответ, который в самом начале прочитал и сообщил боту сам злоумышленник.
Если вы обратите внимание на эти моменты, ваша CAPTCHA будет защищена от ботов, не использующих распознавание. Генерацию картинок, стойких к автоматическому распознаванию, мы рассмотрим в следующей статье.
KCAPTCHA — готовое решение
Проект KCAPTCHA — это готовое решение, написанное на языке PHP, которое вы можете бесплатно скачать и установить на свой сайт для защиты от спама и флуда.
Проект KCAPTCHA ставит перед собой цель предложить программисту решение с одной стороны весьма защищенное, с другой — максимально малотребовательное к ресурсам и конфигурации хостинга.
Вот пример работы (изображение создается «на лету», обновите страницу для генерации других вариантов):
Принцип действия: скрипт заводит сессию и записывает в нее под именем $_SESSION['captcha_keystring'] случайным образом сгенерированную строку, после чего выдает изображение, содержащее эту самую строку в зашумленном виде. При проверке пользовательского ввода вам остается только прочитать из сессии кодовую строку и сравнить с тем, что ввел пользователь (подробнее об аспектах безопасности при проверке пользовательского ввода).
Системные требования: PHP версии 4.0.6 и выше с поддержкой GD версии 2. Не требуются ни библиотеки для работы со шрифтами (Libttf и др.), ни ImageMagick.
В комплект входит набор растровых шрифтов, так что скрипт, скорее всего, будет сразу готов к работе, не требуя установки дополнительных компонент.
Можно настраивать цвета и набор символов, применяемые при создании изображения.
Скачать самую последнюю версию и узнать больше про KCAPTCHA Вы можете на сайте разработчика www.captcha.ru
