Будущее CAPTCHA
Кажется, перед разработчиками начинает маячить проблема роботов, оставляющих спам в форумах или выполняющих автоматическую регистрацию (часто — для того чтобы спамить в тех форумах, где анонимно это сделать не получается).
Традиционно, разработчики либо мирятся с неизбежным злом, либо используют так называемый CAPTCHA-метод — пользователю выводится (часто зашумлённая) картинка с кодом или кодовым словом, пользователь должен ввести то, что он видит на картинке в специальное поле.
CAPTCHA-метод плох вот чем. Относительно простые изображения легко распознаются. Я, в качестве эксперимента, писал простой OCR для Chat.Ru и, посложнее, для SMS-сервиса Beeline.Ru (вероятность правильного распознования — 90%).
Если сильно исказить картинку, пользователь может не понять (со мной такое бывало), что на ней, собственно, изображено и после первой же неудачно попытки ввода уйти — робота же это не смутит. Если, скажем, вероятность распознавания составить всего лишь 20%, ничего не мешает роботу сделать несколько попыток до успеха.
Второй недостаток... Недавнее изобретение спамеров — метод «леммингов». Спамер открывает порносайт и... предлагает всем желающим войти, в качестве «платы», ввести код, написанный на картинке. Картинка берётся с сайта «жертвы». Как только «лемминг» вводит код, спам-робот использует его для регистрации или спама в нужном ему форуме.
Разновидность этого CAPTCHA-метода — просто писать слово с опечаткой или пропущенной буквой с просьбой ввести правильный вариант. Решение простое, но, когда я подумал над проблемой обхода такой защиты, решение этой проблемы пришло мне в голову менее чем за 15 минут. Многие сервисы поисковика «Яндекс» (например, Lingvo) предлагают варианты замены неверно написанного слова. Дело техники — «скормить» Яндексу слова с ошибкой и получить верное написание.
Защиту от техники леммингов, в общем случае, я предложить не берусь — разве что отлавливать подозрительную активность с какого-то IP адреса. А вот плохораспознаваемые роботом CAPTCHA-методы, но хорошо воспринимаемые человеком, на мой взгляд (приглашаю к здоровой дискуссии), существуют. Методы расположено от более вероятных (опять же, на мой взгляд), к более сомнительным.
Образы.
Незаслуженно редко используют в качестве CAPTCHA-токенов изображения. Подобрать сто случайных изображений и сменить их, в случае активности спамеров — не проблема. Защиты такого рода существуют, но у них, на мой взгляд, существует недостатки:
- Они предлагают пользователю ввести слово
целиком. Пользователю неудобно. Я предлагаю использовать radio-кнопки, вероятность
угадывания роботом увеличивается, но смотри пункт 2. - Они ничего не делают в случае неправильного ответа. Единственное, что сразу приходит
в голову — сразу блокировать IP нарушителя. Делать так можно, но существует
опасность заблокировать весь dialup-пул какого-нибудь провайдера, всех пользователей
какого-нибудь NAT или прокси-серверов.
Пользователь (см. иллюстрацию)
может не попасть по «зайцу» (кто-то отвлёк, мышка заела) и выбрать «дрезину», но
он не за что не кликнет в «рукомойник». Человек, в здравом уме, не спутает зайца с рукомойником.
Ошибки позиционирования для близлежащих элементов можно и нужно прощать, за остальные —
наказывать: для этого IP переходить к другому, более неприятному CAPTHA-методу,
заставляя вводить слово целиком. - Они не пытаются запутать робота. Базу картинок, можно слить, если спам на
данный сервер очень важен или у спамера много свободного времени,
составить hash каждой иллюстрации и занести в базу.
Несложно увеличить стоимость взлома — достаточно выводить не одну картинку, а, например,
вывести в одну картинку сразу три изображения и туда же (в картинку) писать вопросы вида:
«что изображено на картинке в центре».
Количество вариантов изображения увеличивается
до N*M*S, где N — количество изображений в базе, M — количество изображений, печатаемых
в одну иллюстрацию, S — количество вариантов фраз. Важно, кстати, не делать изображения
фиксированными по ширине — иначе их легко будет разделить. Проявите фантазию — изображения
можно чуть масштабировать, инвертировать или перечеркнуть, фразу — писать в случайном месте
и так далее. Число вариантов увеличивается настолько, что базу можно и не менять. А методы
разделения и распознавания изображения по его участку не сработают.
Figlet.
История FIGlet началась весной 1991 года. Frank Sheeran написал другу автора первой версии Ian Chai письмо, где в качестве подписи использовалась строка, написанная ASCII-графикой. После чего Glenn Chappell, автор первой версии FIGlet, написал на C небольшуй программу, позволяющую писать придуманным им шрифтом любые строчки. FIGlet так и расшифровывается «Frank, Ian and Glen’s letters» («письма Френка, Иана и Глена).
С тех пор появилось несколько версий подобных программ, библиотеки на различных языках, я сам, относительно недавно, написал библиотеку Text_Figlet для PHP (скоро войдёт в PEAR). В данный момент доступно примерно 420 шрифтов для написания.
Шрифт в изображении можно уменьшить, например, до 4 пикселей и фраза на экране будет занимать вполне приемлемое пространство. Жизнь спамера осложняется не только тем, что количество шрифтов довольно велико, но и эффектом „smushing“ (горизонтальная склейка), который используется в некоторых шрифтах. Посмотрите внимательно на написанную фразу — соседние буквы в ней „склеены“.
В начале было слово...
В начале было слово, но записать его, думаю, было нечем — Богу вряд ли нужна авторучка с бумагой, а людей тогда ещё не было. Первые люди писать тоже не могли, но могли говорить. Так что голос — довольно древнее средство общение, но с его распознованием у роботов всё ещё большие проблемы.
Некоторые сервисы (LiveJournal), например, используют альтернативный CAPTCHA-метод — проговаривание фразы синтезированным голосом. В синтезе голоса давно нет ничего удивительного, но есть свои недостатки — синтез голоса более ресурсоёмкая операция, фраза с трудом распознаётся не носителями языка, да и звуковые платы есть не у всех. Пока метод можно рекомендовать к использованию разве что в качестве альтернативы.
Активный контент.
Надеюсь, этот метод распространения не получит распространения — я такой контен недолюбливаю, но спам не люблю ещё больше. В браузерах есть такая вещь как плагины — наиболее распространнёными, наверное, можно считать Flash и Java — два языка программирования, на которых вполне можно написать приложение выводящее текст или цифры.
Разобраться в том, как это приложение работает, чтобы понять что оно выводит роботу не по силам. В принципе, можно было бы давать Java-машине или Flash-плагину отобразить изображение, снять с него скриншот и распознать его, но стоимость такого взлома, как мне кажется, непомерно высока.
Animated GIF.
Несколько более простая разновидность предыдущего метода не требующая отдельного плагина — Animated GIF. Если бы вы смогли разыскать где-нибудь 13-й параграф из „Ководства“ Лебедева (на сайте его нет), то вы бы смогли прочитать следующее:
Хитрость заключается в том, что GIF позволяет создавать анимации, где каждый кадр может иметь свою локальную палитру. Предел палитры в GIFе, как мы знаем — 256 цветов. Но никто не говорил, что нельзя записать 10 кадров, в каждом из которых было бы по максимуму цветов и которые были бы все одновременно видны. В результате мы получим 2560 цветов. Неплохо для начала.
Подобная идея приходила в голову не одному только Лебедеву, конечно. Картинка — одна из иллюстраций из статьи True Color GIF, где в формате GIF используются 32796 цветов. Заливка, которую вы видите, нужна лишь для демонстрации — в „Ководстве“ Лебедева GIF, содержащий 1792 цвета отображался без заливки, сразу целиком.
Пора, наверное, уже сказать к чему я клоню, если вы ещё сами не догадались. Разбор GIF’a, скомпонованного подобным образом — задача довольно сложная. Писать можно полноцветными буквами, части которых находятся в разных кадрах, играя с их перекрытием (например, заслонять символы или их части).
Безусловно, задача решаемая — нужно только последовательно разобрать все кадры и наложить их один на другой, но для этого нужно уметь работать с animated GIF, да и правильно наложить один кадр на другой — в общем, тут есть где споткнуться спамеру.