Распознавание CAPTCHA от PHPbb

Не секрет что движок форума PHPbb очень сильно распространен в интернете. Это и не удивительно т.к. он бесплатен и по своему функционалу не уступает платным аналогам. Но он имеет слабую защиту captcha.

СAPTCHA – (Completely Automated Public Turing test to tell Computers and Humans Apart полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей) — торговая марка Университет Карнеги – Меллона, компьютерный тест, используемый для того чтобы определить, человек ли использует систему. Термин появился в 2000 году. Основная идея теста: предложить пользователю такую задачу, которую легко решает человек, но которую невозможно (или крайне трудно) научить решать компьютер. В основном это задачи на распознавание образов. ©http://ru.wikipedia.org/wiki/CAPTCHA

В форуме PHPbb captcha применяется для защиты от авторегистраций, т.е. для того чтобы быть уверенным, что регистрируется живой человек, а не програмый продукт, который имея базу ссылок на множество форумов PHPbb автоматически на них зарегистрируется, а затем автоматически добавит на каждый из форумов одно или несколько сообщений рекламного характера, или даже со ссылку на «раскручиваемый» ресурс. 😉 Даже если администратор форума раз в день удаляет рекламные сообщения не по теме форума, программа может каждый день регистрироваться и занова добавлять рекламные сообщения. Вот такое вот противостояние спамеров и владельцев форумов. Стоит отметить что первоначально спамеры регистрировались и постили сообщения вручную, в конце концов многие из них стали искать пути полной автоматизации своего спаммерского труда, самое трудное из программного решения данного вопроса было обход captcha при регистрации.

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

captcha PHPbb

РИС. 1

Я согласился, ибо задание было достаточно интересным, и обещанная оплата в 300 USD сыграла не последнюю скрипку.

За работу…

В первую очередь скачал, последнюю версию движка форума PHPbb. Далее развернул у себя, посмотрел функционал и скрипты.

Анализ …

Сгенерировал пару десятков картинок начал прикидывать как с ними быть.

Итоги наблюдения:

– картинка состоит из серых цветов

– использовался один и тот же шрифт

– вращение символов не используется

– буквы находятся не на одной линии, но точек соприкосновения между собой не имеют

– буквы более темного цвета тем фон, а на всю картинку точечно разбрызган серый цвет

Последний пункт мне показался особенно забавен, т.к. использовался оптический эффект – серый цвет на белом фоне кажется более светлым, чем он же на черном фоне, для человека написанные буквы оставались четкими, а вот для программы по замыслу создателей phpbb, было бы затруднительным четко обозначить местоположение буквы, и далее ее распознать.

Первые шаги …

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

Далее …

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

Финал…

Дописываю проверку соответствия прототипам. Использую следующий алгоритм. Сначала смотрю размеры картинок, если различаются размеры то и сравнивать попиксельно нечего. Сравниваю попиксельно использую накопление рейтинга сравнения, если два черных пикселя в одинаковых местах +10, если в прототипе черный а в нераспознанном символе белый пиксель +5, если наоборот -30. Символ набравший большее число, заносится в строку, которая затем возвращается из функции.

Пост финал …

Создаю систему тестирования правильности работы данной функции. Опять же использую проникновение внутрь phpbb, теперь уже забираю из таблицы шесть символов, с которыми система phpbb сравнит введенные пользователем символы. Прогоняю методом тестирования 1000 картинок, не распознанными оказались около 10, создаю на их основе дополнительно еще прототипы. Прогоняю еще 2000 картинок, не распознанные 3. И еще выяснилось, что стоящие последовательно WW cоприкасаются. Посчитав шанс наступления данного события, принял решение не париться с данной дилеммой. Прогоняю еще 2000 картинок, теперь уже все распознано 100%.

Протестировать программу в работе можно здесь https://www.e64f.ru/phpbb/

З.Ы. Заказчик в последствии выкупать программу отказался, может это и к лучшему, хотя может тогда разработчики быстренько решили бы проблему с легко распознаваемой captcha в форуме phpbb.

3 комментария на «Распознавание CAPTCHA от PHPbb»

  1. Sergey пишет:

    Скажите, а насколько реально программно распознавать капчи в которых есть повороты символов? А то шеф дал задание научиться распознавать капчи, мучаюсь уже месяц, а результата 0.

  2. e64f пишет:

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

  3. Андрюха пишет:

    Супер. Ждем новых сообщений по этому же поводу 🙂

Оставьте свой отзыв

*

code