gifts2017

Личный опыт тестов Тьюринга

Опубликовал Осипов Сергей (fixin) в раздел Обмен - Интеграция с WEB

Личный опыт использования тестов тьюринга в администрировании форума PHPBB

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

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

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

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


yahoo.com
 

captcha
 

mail.ru
 

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

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

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

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

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

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

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

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

   

5451
   

243

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

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


3332

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

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


11342

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


61242

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


25528

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Осипов Сергей (fixin) 18.12.11 09:22
Личный опыт использования тестов тьюринга в администрировании форума PHPBB

Перейти к публикации

1. see1c ru (see1c.ru) 18.12.11 09:22
Тема интересная.
А если использовать маленькие стерокартинки в которых будет написан текст, или изображение предмета и комментарий к нему.
http://infostart.ru/public/77536/
думаю распознать это будет очень сложно.
2. Андрей Акулов (DrAku1a) 18.12.11 13:59
Не совсем уместно на сайте 1С ИМХО... Хотя для общего развития =)

Мне как-то рассказывали хохму про индусов, которые сидят и за центы перебивают капчи "вручную" тысячами за день... Страна бедная, денег зарабатывать надо - вот и придумали ))) Думаю, битву с индусами Ваша система не выдержала бы =)
3. Ийон Тихий (cool.vlad4) 18.12.11 14:07
(2) это так и есть, китайцы и другие азиаты, на заказ перебивают капчи. (0) на самом деле это скучная тема. на хабре и на других ресурсах описано и сделано очень много капч. для бизнес-приложений - я считаю это неактуально (например интернет магазин или техподдержка), пользователи терпеть это не могут.
Думаю, на данный момент можно построить тест, который компьютер не одолеет за разумное время, даже после предварительной подготовки.
вся проблема в том, что не каждый человек в этом случае тоже одолеет)))
4. Осипов Сергей (fixin) 18.12.11 15:00
(3) против индусов можно использовать 1. русский язык. 2. российские контексты
5. Сергей (necropunk) 21.12.11 10:00
(1) see1c.ru, стереокартинки тоже не все умеют смотреть. Да и если монитор хреновый - замучаешься в маленькой капче в стереокартинку вглядываться. А большая весить до фига будет... Да и видел где-то алгоритм вставки и выдергивания изображений из подобных картинок, а уж после этого робот распознает за милую душу, полагаю.
6. Defm (Defm) 21.12.11 10:34
Сообщество не сильно оценило статью: имхо не совсем инфостартовская тематика, кроме того никаких конкретных реализаций. Вопросы распознавания капчи на само деле широко освещены если поискать.. Полезно, но плюс не поставлю
7. Андрей Казанцев (ander_) 21.12.11 16:16
Давно и очень эффективно пользуюсь тематическим вопросом (ответ на который очевиден целевой аудитории форума). О спам ботах просто забыл.
8. Сергей Емельянов (ser5ax) 22.12.11 11:00
В одном из последних примеров Вы пишете значение 61242, но вот что-то у меня получилось 67242)))
9. simpa simpal (simpal) 27.12.11 14:24
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа