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

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


Построение защищенной надписи

Как рисовать устойчивые к распознаванию надписи? Для того, чтобы ответить на этот вопрос, следует ответить на другой — на каких принципах строятся алгоритмы распознавания. Тогда мы поймем, как это распознавание максимально затруднить.

Вопреки распространенному мнению, для обхода CAPTCHA, как правило, не используются универсальные программы распознавания отсканированных текстов типа FineReader или MS Office Document Imaging, поэтому, если ваша CAPTCHA не поддается распознаванию этими программами, это не означает, что надпись не может быть легко распознана заточенной именно под нее персональной распознавалкой (см. раздел Примеры взлома).

Распознавание делится на 2 основным этапа:

Если символы всегда находятся на одних и тех же местах (как, к примеру, у форума Invision Power Board — см. иллюстрацию справа), из этих двух этапов остается только второй. Поэтому, как минимум, надо обязательно варьировать координаты символов.

Если места символов не фиксированы, следующий путь по их выделению — сравнение по контрасту с фоном. Если цвет символов отличается от цвета фона (как у форума phpBB), это не дает никакой защиты:

 → 

Оставили только темные пиксели - и "вуаля".
Желтым выделены обнаруженные знакоместа (прямоугольники, содержащие в себе "темные пиксели")

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

Собственно распознавание символа может происходить разными способами.

Самый простой способ — "наложение маски". У программы есть эталонный шрифт, с каждым символом которого она сравнивает распознаваемый. Тот символ, у которого больше всего совпадений (пикселей того же цвета, что и в эталоне), и считается ответом.

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

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

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

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

Рассмотрим применение этих принципов на примерах реальных CAPTCHA (звездочками у названия показана моя личная оценка защищенности - от 1 до 4):

Google ***
Нелинейное искажение надписи, смещение символов друг относительно друга, близкое расположение символов, различные шрифты. 
Шумы не применяются. Правда, символы не всегда склеиваются без промежутков.
MSN ****
Поворот и искажения символов, шумы в виде линий того же цвета, пересекающих символы.
Yahoo ***
Нелинейное искажение символов, шум в виде пересекающей символы ломаной.
Из недостатков – ломаная может быть отделена от символов.
Mail.ru очень старая **
Поворот символов, небольшое варьирование шрифтов, низкий контраст с фоном. На мой взгляд - не очень хорошая CAPTCHA (символы, как правило, темнее шума, расположены обособленно)
Mail.ru старая ****
Смещение по высоте, нелинейное искажение символов, шум в виде пересекающих символы ломаных того же цвета.
Yandex ****
Склейка контурных символов, нелинейные искажения, шум в виде белых и темных линий.
Rambler старая **
Разноцветные символы, поворот, смещение. Шум в виде точек и прямых линий.

Rambler ***
Нелинейное искажение символов. Символы, однако, легко отделяются друг от друга и от шума. Дело только за распознаванием символов, а это не так сложно даже без привлечения нейронных сетей (учитывая то, что символы являются цифрами и искажаются в основном по горизонтали).
Билайн ***
Небольшие линейные искажения символов, разный размер. Символы помещены на фон с шумом в виде геометрических фигур (эллипсов) методом инверсии. Недостаток: цифры контрастнее фона.
МТС старая **
Небольшой поворот, смещение символов. Изредка наползание их друг на друга. Шум легко убирается  уменьшением резкости (blur). Довольно слабая CAPTCHA
МТС новая ***
Небольшой поворот, смещение символов. Изредка наползание их друг на друга. Шрифты. Значительный шум, как в виде фоновой текстуры, так и линий, накладывающихся на символы. Правда, изредка даже человек не всегда легко прочтет результат.
Мегафон ***
Смещение символов, шум в виде линий и точек.
Параллельные линии могут быть отфильтрованы, с наклонными сложнее.
Скайлинк *
Какая-то пародия на CAPTCHA. Неизменный шрифт, неизменное расположение символов. Легко может быть прочитано наложением маски.


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