Pull to refresh

Оригинальная каптча. Часть 2 — Продолжение

Reading time3 min
Views1.8K
Эта статья — продолжение моих попыток создать оригинальную каптчу.
В прошлой статье (link), я хотел опереться на нейронные сети, чтобы распознавать рисунки от пользователей, и реализовал frontend каптчи: собственно возможность рисовать.
Но судя по двум комментариям прошлой статьи, набравших максимальное кол-во плюсов:

roman_tik +44
«Рисовать мышкой несколько фигур — это геморой для реального человека...»
knine +44
«Мона Лиза»

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

Немного теории.

Подход современных каптч — дать решить такую задачу, которую легко решит человек, но не решит машина (хотя, в конце концов “истинный” ИИ, прошедший тест Тьюринга, все равно решит эту задачу). Но вместо этого основная часть каптчей генерирует символы, которые, якобы должен распознать человек, но не распознает машина. Современная же техника с легкостью выполняет обратную задачу (OCR), чтобы усложнить работу “распознавателя”, в каптчу вносят шумы, искажают симолы, тем самым ухудшая показатели распознаваемости и человеком.
Вот, например символы каптчи: كلمة التحقق — они не на картинке и они не искажены, но не зная этого языка человек не поймет, что это и не пройдет тест, для машины же это просто точный набор символов. К чему это? К тому, что слово “автомобиль” это одно, а сам автомобиль — другое. Само слово “автомобиль” для машины знакомо, а вот понятие автомобиля для него не существует.
Каким образом происходит обучение человека? Показываем ему автомобиль и объясняем что это “автомобиль”, показываем ему лошадь и говорим ему, что это лошадь (а так же животное, парнокопытное, живое существо и др.). Для машины такая задача тоже частично подвластна. И ещё, что автомобиль, что лошадь являются средством передвижения — для человеческого мышления этот вывод будет очевиден.
Значит, стоит заставить машину оперировать не с символами, а например, с образами, которые машина не “понимает”. Казалась бы, какая разница, а разница в том, что символов в алфавите всегда конечное кол-во (даже иероглифов), а образов бесконечное множество. Хотя может показаться, что образов существует столько сколько и слов, но это не так. Например:
image — это ключ;
image — и это ключ;
image — снова ключ;
image — опять бьют ключи (казалась бы зачем бить ключи — лучше ими открыть двери).
— а такого слова в русском языке вообще нет.

Идея

Соединив данную теорию, с наработками из первой статьи, я пришел к выводу выводить картинки и давать пользователю находить нужные с помощью образного мышления.
Но стоп, эта идея не нова — такие каптчи уже существует. Но у них есть недостаток, чтобы не поддаваться взлому через перебор, картинок на сервере должно быть большое кол-во.
Я же решил ограничиться малым кол-вом картинок. Для этого, чтобы исключить перебор, я решил накладывать картинки друг на друга. Вы можете отличить зад автомобиля от зада лошади? Думаю да.
Осталось додуматься склеивать все картинки в одну и вместо номера картинки отправлять на сервер координаты (следовательно, расширив область возможных значений ответов) верной картинки.

Реализация

За день набросав код, получилась вот такая симпатичная каптча:

Генерировать такую каптчу достаточно просто, в моем варианте существует всего 10 видов предметов по 3 вариации предмета каждого вида.
При создании картинки из рандомных предметов, запоминаем координаты правильных ответов и вуаля, при проверке ответа пользователя проверяем вхождение отмеченных координат в исходные.
<?php
if (isset($_POST['check']) && isset($_POST['answer']) && $_POST['check'] == 1){
   $answerUser = json_decode($_POST['answer']);
   $answerCaptcha = unserialize($_SESSION['nncaptcha']);
   echo json_encode(array('checked'=>$answerCaptcha->checked($answerUser) ));
   exit();
}
?>

Вот и вся проверка.
В живую каптчу можно глянуть тут. (осторожно слабый хостинг!)

Это самая простая каптча из этой области, можно легко увеличить кол-во образов (как на каптче, так и в системе), можно не одинаково ресайзить мини-картинки, поворачивать картинки на разные углы, проделывать то же самое с текстом.
Практически все это уже реализовано в этой каптче. В скрипте используется обычный GD, можно переписать на imagick — будет ещё больше возможностей (например в GD нет штатного функционала для поворотов на определенный угол картинки). Если, вдруг, кому будет интересно, в следующей статье могу выложить исходники с объяснениями (PHP 5.3).

UPD1:
Статистика прохождения:
  1. 50,9% — Успешно прошли
  2. 1,2% — Вышло время
  3. 47,9% — Ошиблись

Всего проб (на данный момент): 12627
Уникальных посетителей: около 6000

В скором времени обновлю каптчу по советам комментаторов (например этот) — потом обнулю статистику.
Tags:
Hubs:
Total votes 71: ↑45 and ↓26+19
Comments76

Articles