logo
Противодействие интернет-ботам

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

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

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

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

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

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

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

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

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