Картинка защита от спам-ботов и автосамбита - создать проблемы распознавания ботам

[Удален]
1712

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

Этот вопрос волнует не меня одного:

Какая картинка лучше для защиты от автосабмита?

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

Делюсь выводами и размышлениями.

Рассмотрим наиболее типичные картинки защиты:

(см. Рисунок 1).

На первый взгляд все три варианта распознать сложно.

Это ошибочно.

Давайте посмотрим нам эти картинки с точки зрения программиста, которому поставили задачу распознать эти числа.

Сначала нам потребуется алгоритм распознания.

Составим маску для цифр:

(см. Рисунок "Маски").

Здесь красным отмечены точки, в которых должно быть отличие яркости более 50%, от тех точек, которые отмечены синим, тогда мы будем считать цифру совпавшей с маской.

Далее мы будем обходить (сканировать) маской изображение:

(см. Рисунок "Сканирование маской").

Где:

ш1 = координата наложения маски X=0, Y=0;

ш2 = координата наложения маски X=1, Y=0;

ш3 = координата наложения маски X=1, Y=1;

шN = координата наложения маски X=n, Y=n;

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

X где было совпадение мы запоминаем.

В итоге мы имеем координаты, где находились цифры, и какие именно это были цифры, далее по расположению (координата X) определяем порядок следования цифр.

Это будет работать, только если у нас чистая от шума картинка (линии в 1 точку для нас не помеха, но и от них лучше избавиться).

Избавимся от шума.

Будем использовать только простые (не ресурсоёмкие) алгоритмы.

Прежде всего, попробуем удалить все цвета кроме чёрного, белого и оттенков серого (все _цвета_, просто приравняем к белому), примерно так (для RGB):

if (r[x,y] != g[x,y] && g[x,y] != b[x,y] && b[x,y] != r[x,y]){r[x,y]=255; g[x,y]=255; b[x,y]=255;}

Избавились от цветовых элементов... сверили с маской.

Цифры найдены - ОК.

Если нет - переходим к методу 2:

Вернёмся к исходному изображению (возьмём его из буфера в памяти) и сделаем то, что в фотошопе называется "яркость/контрастность", а точнее поднимем и яркость и контрастность изображения до 100%.

Опять повторим проход маской.

Если цифры найдены - ОК.

Можно ещё поработать с порогами при которых идёт удаление цвета, удалять только определённые цвета, поднимать яркость/контрастность, затем размывать на 1 точку, и снова поднимать яркость/контрастность, что бы удалить разрывы в цифрах вызванные наложением шума.

Как можно увидеть, манипуляции с удалением цвета и яркостью/контрастностью замечательно работают для вариантов A и B:

(см. Рисунок "Первые рисунки после удаления шумов").

Остаётся вариант "Ц".

Для варианта "Ц", тоже есть решение, как привести геометрию к некой норме (я знаю его но не буду его описывать здесь), решение это весьма ресурсоёмкое и оно не будет работать если искажения введены как по оси Y так и по оси X да ещё и нелинейно.

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

В итоге, лучшим можно признать вариант искажений "Ц".

Ещё лучше, если этот вариант немного усложнить (печатать не цифры а цифры прописью и случайные фрагменты изображения инвертировать):

(см. Рисунок "Вот это точно лучше").

В процессе генерации такое изображение может быть получено эффектом "Линза" + "Скручивание" или "Волна" или 2-3 раза применив эффект "Линза".

Теперь несколько слов, что бы Вас шокировать, уважаемые :)

Можно распознать число, не распознавая картинку!

Как?

Очень просто - ваш генератор картинок каким-то способом передаёт то, что он сгенерировал в виде JPG, скрипту который сверяет то, что ввёл пользователь, глядя на сгенерированное JPG. Или скрипт сверщик, передаёт генератору что нужно сгенерировать в виде графики.

Так или иначе, этот процесс передачи - слабое звено.

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

Для примера, простейший генератор хеша числа:

NUMmy = число которое нужно передать;

NUMout = то что будем передавать (в куках или как ещё - не важно) и с чем будем сверять;

NUMout = int( (NUMmy * 7 + 11) / 3);

Получить NUMmy из NUMout невозможно не зная как получен NUMout, а для некоторых NUMmy вообще невозможно.

Можно поступить и проще:

$out = md5_hex('ля-ля-ля'.$num.'ещё ля-ля-ля');

Дополнительные 'ля-ля-ля' и 'ещё ля-ля-ля' необходимы, т.к. "распознавальщикам" никто не мешает точно так же воспользоваться той же функцией, однако не зная дополнительных символов они не получат нужный результат.

И не забывайте про ограничения по времени!

Ведь если срок "жизни" вашего числа на картинке не ограничен, то распознав его глазами 1 раз, не сложно всегда применять его.

Оптимальным, я считаю, срок жизни числа или хеша равным 60 минут.

Хотя на выделенной линии с хорошей скоростью и за 60 минут можно натворить много неприятного.

Вообще, намного лучше ограничение на число использований картинки, но это, наверно, уже слишком сложно :)

Таким я увидел мир картинок, взглянув на них глазами спам-бота... Как защищаться - решать Вам

jpg 3139.jpg
stealthy
На сайте с 15.06.2006
Offline
69
#1

Вы изобретаете велосипед. Все три картинки в верхнем ряду вообще не могут использоваться как защита от спам-ботов, причем это понятно было уже 3-4 года назад. В сети навалом (точно тестировал 5 или 6) сервисов, который предлагают онлайн тестирование картинок и прогнозируют процент распознавания различных защит (например вот: http://www.ocr-research.org.ua/demo.html). В крайнем случае разработчику можно брать демо-версию файнридера и прогонять картинки через нее.

На текущий момент есть даже рекомендованная исслодовательскими лабораториями Microsoft примерная форма CAPTCHA изображения, которая на практике устойчива к распознаванию ботами. Можете почитать тут: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/hip_aspnet.asp. Ничего сложного с точки зрения разработчика там нет, мы в нашу CMS встроили подобный алгоритм для генерации защитных кодов согласно этой спецификации примерно за 2.5 часа. Пример, о котором я говорю, можно увидеть на www.stratek.ru/feedback.

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

А что CAPTCHA можно обойти и без распознавания кода в лобовую в статьях (западных) расписано было еще 5 лет назад. Есть даже методы подбора кодовых строк, которые идентифицируют картинку и, как правило, передаются в хидден поле. Но это уже высший пилотаж. А в большинстве случаев это вообще тривиально из-за неграмотной архитектуры решения. Например в Битриксе модуль CAPTCHA содержит элементарную недоработку программистов, никакого распознавания вообще не требуется, спамь - не хочу.

Twilight CMS (http://www.twl.ru): есть Free версия, очень проста и удобна в использовании. Консультирую по любым вопросам. Новый спорт - практическая стрельба (http://nikit.in) - не для офисного планктона.
[Удален]
#2

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

stealthy:
причем это понятно было уже 3-4 года назад

Дополнили. Спасибо.

stealthy:
Вы изобретаете велосипед.

Я не боюсь изобретать велосипеды :) Страшнее потретять дар изобретать...

Спортивный велосипед с карданным валом (производитель: ALPINE BIKE)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий