CAPTCHA.ru
Что такое CAPTCHA
Статьи
Алгоритм проверки
Генерация изображения
Альтернативы
Виды взломов сайтов и их предотвращение
Алгоритмы
Примеры взлома
Проект KCAPTCHA
Ссылки
Отблагодарить
English

Программный код CAPTCHA на PHP


Алгоритм CAPTCHA-проверки

Кратко рассмотрим алгоритм CAPTCHA-проверки посетителя, сделав упор на защиту от уязвимостей, не связанных с собственно распознаванием картинки:

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

Скрипт генерирует случайный текст, записывает его в сессию и выдает картинку с этим текстом посетителю. Потом, при проверке, ответ, введенный посетителем, сравнивается с эталоном, сохраненным в этой сессии.

Важно, чтобы закодированный текст никак не вычислялся из данных, передаваемых браузеру. К примеру, плоха идея хранить текст не в сессии на сервере, а передавать его (пусть даже в кодированном виде) аргументом (через адресную строку или cookie) скрипту-картинке, с тем, чтобы скрипт текст раскодировал и выдал соответствующее изображение — угадать принцип кодирования не так сложно, на самом деле. Потом, если на сервере этот текст не хранится, а передается с запросами, его вполне можно подменить.

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

Генерация кода самой картинкой позволяет реализовать функцию "получить другой код, если этот плохо читается пользователем" — будет достаточно обновить только картинку.

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

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

Если вы обратите внимание на эти моменты, ваша CAPTCHA будет защищена от ботов, не использующих распознавание. Генерацию картинок, стойких к автоматическому распознаванию, мы рассмотрим в следующей статье.



© Круглов Сергей. Опубликованные на сайте алгоритмы можно свободно использовать и модифицировать.
Система управления сайтом CAPTCHA.ru: Managee