Я не люблю, когда на форумах анонимным пользователям отказывают в праве ответить на сообщение. Однако причина понятна - анонимным пользователем может оказаться обычный робот-спаммер, засоряющий форумы. Так вот из-за спама страдают ленивые пользователи, которым лень регистрироваться на ресурсе, который они может быть больше и не посетят, если им не ответят, или у которых нет e-mail.

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

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

Я поискал сайты с таким текстом и составил небольшую коллекцию картинок:


yahoo.com
 

captcha
 

mail.ru
 

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

Я изложу вам историю нашего противостояния, чтобы вы могли представить себе состояние искусственного интеллекта в области OCR. В конечном итоге способ защиты был обнаружен. Он оказался не по зубам современному ИИ, но к этому результату привела длительная и головоломная борьба со спаммером. :) За это ему и спасибо.

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

Как видно, буквы стали размытыми, появилась вносящая наводки на распознавание сеть и вместо 10 объектов распознавания (цифры), появились буквы и знаки. Но и эту картинку ИИ переварил, правда знаки *+- и т.п. он не очень хорошо распознавал.

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

В конце концов движение в этом направлении привело к тому, что пользователям стало трудно распознавать тест, а защита по-прежнему взламывалась.

Я пробовал добавлять снег (короткие случайные линии), сетку, играть с цветом, но все взламывалось:

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

   

5451

243

Это был сложный тест и в нем легко было запутаться и сбиться со счета. Но картинки были одинаковы, хоть и разного размера. И спаммер этим воспользовался, легко взломав тест. Распознать одинаковые картинки, даже с учетом поворота и изменения размера, достаточно легко. Буквы же, хоть и были написаны разными шрифтами, но распознавались по форме. В конечном итоге тест представлял смесь латинских букв, написанных разными шрифтами и картинок. Чтобы пользователю не выискивать одинаковые фигурки,они были вынесены в рамку в левый верхний узел.

Тут я совсем зашел в тупик. Помог мне мой друг Саня Fduch из Кенига, он сказал - тебе нужно рисовать картинку и спрашивать у пользователя - сколько ежиков сидит под сколькими елочками? Ну он немножко не так сказал, выразительнее, используя силу русского и могучего языка, но это подтолкнуло меня к идее.


3332

В первом варианте использовался тот же принцип подсчета одинаковых картинок. Однако один и тот же объект мог изображаться абсолютно разными картинками, непохожими друг на друга. Посмотрите, на картинке три совершенно разных картинки. Сначала я ограничился небольшим набором картинок, тест стал ломаться реже.

Но пользователям было неудобно считать картинки, я немного изменил логику работы, пользователь должен был ввести пятизначное число, заменяя звездочки соответствующими номерами картинок:


11342

Тест получился удобным и при большом наборе картинок неломаемым. Однако его можно было еще улучшить.Картинок предлагается больше, чем требуется ввести, что еще больше усложняет задачу спаммера. В последней версии тест выглядит так:


61242

Очевидно, что чем больше картинок в коллекции, тем надежнее работает тест и тем более он устойчив к взлому. Дополнительно я добавил небольшой поворот картинок (0-15 градусов) и помехи - не просто линии, а разноцветные треугольники, квадраты, точки, окружности и т.п. Некоторые картинки, которые допускают поворот, я поворачиваю на случайный угол от 0 до 360 градусов. Работает быстро:


25528

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

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