Создание оригинальной каптчи, используя нейронные сети. Часть 1

Как и у всех программистов, недавно у меня возникло желание изобрести собственный “велосипед”. Так как изобретать свою CMS, Framework, и т.д. уже не актуально, то мой взор обратился на каптчу. Казалось бы, что тут можно придумать оригинального, каких только каптч не существует: 2D-картинка, 3D-картинка, звуковая каптча, выбор “правильной” картинки. Но мне пришла в голову мысль, что создатели каптч думают как-то однобоко, то есть все хотят получить однозначно правильный ответ от пользователя (и обычно в тестовом поле), причем в простом виде, серверу лишь остается сравнить ответ с исходными данными! Вот я и решил исправить это дело и создать собственную “умную” каптчу.


Вступление

Идея моя проста: выводить пользователю в виде каптчи простые фигуры, например квадрат, круг, треугольник, и просить пользователя нарисовать эти самые фигуры. Конечно, 3 фигуры маловато, но зато можно их комбинировать и выводить в любом количестве. А на сервере принимать ответ пользователя (и как вы уже догадываетесь), распознавать данные образы с помощью нейронной сети (вот поэтому я пока и остановился на 3 фигурах, чтобы облегчить нейронную сеть, использовав только 3 выхода).
Недолго думая приступил я к реализации этой идеи, этот процесс я и собираюсь описывать в статьях...

Реализация

Начнем реализацию с клиентской части.
Отдавая дань моде, я воспользуюсь javascript фреймворком jQuery, да и признаюсь, он довольно таки сильно облегчит нашу задачу. В целях ещё большего облегчения задачи будет использоваться , как контейнер для рисования.
Раз я уже решил использовать jQuery, то ради красоты кода и удобства оформим всё в виде плагина, заодно и новичкам такой опыт пригодится. В завершенном виде выглядеть будет где-то так:
<!DOCTYPE html>
<html>
<head>
<title>Demo NNCaptcha</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="nnCaptcha.js"></script>
</head>
<body>
<div id="nnCaptcha"></div>
<script type="text/javascript">
$(document).ready(function(){
   //Выводим каптчу
    $("#nnCaptcha").nnCaptcha();
});
</script>
</body>
</html>

Начнем с пустой “болванки” для плагина.
(function($) {
    // наши публичные методы
   var methods = {
       // инициализация плагина
       init:function(params) {
           var options = $.extend({}, defaults, params);

}
   };
    $.fn.nnCaptcha = function(method){
   
       if (this.length != 1) {
           $.error('not 1 element!');
           return;
       }
       // немного магии
       if ( methods[method] ) {
           // если запрашиваемый метод существует, мы его вызываем
           // все параметры, кроме имени метода прийдут в метод
           // this так же перекочует в метод
           return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
       } else if ( typeof method === 'object' || ! method ) {
           // если первым параметром идет объект, либо совсем пусто
           // выполняем инициализацию капчи
           return methods.init.apply( this, arguments );
       } else {
           // если ничего не получилось
           $.error( 'Метод "' +  method + '" не найден' );
       }
   };

})(jQuery);


Вот типичная “болванка” плагина для jquery, которая позволяет вызывать внутренние методы и передавать им параметры, например:
$("#nnCaptcha").nnCaptcha(‘reset’,1); //вызываеться метод reset с параметром 1 (очистка капчи от “рисулек”)

Займемся нашим главным методом init. В нем построим таблицу с N колонок, и двумя строками, вверху будем отображать картинки, а внизу пользователь будет их срисовывать. Повесим все необходимые обработчики и поместим все в DOM документа.

Начнем с построения таблицы. Легким путем я не пошел (вставить готовый html код), зная на что способна функция $(), я построил таблицу “на лету”. Получился довольно не тривиальный способ построения таблицы с переменным количеством столбцов:
    //Вставляем в контейнер капчи заготовку table
           this.append('<table class="tbCaptcha"><tbody></tbody></table>');
           //Строим таблицу из 2 строк и countCanvas колонок
           this.find("table.tbCaptcha").find('tbody')
               .append(function($){
                           var tr = $('<tr>');
                           for (i=0;i<countCanvas;i++)
                               tr.append($('<td>')
                                               .append($('<img>')
                                                   .attr('src', 'nnCaptcha.php?image=get')
                                       )
                               )
                           return tr;
                       }($)
               ).append(function($){
                           var tr = $('<tr>');
                           for (i=0;i<countCanvas;i++)
                               tr.append($('<td>')
                                       .append($('<canvas>')
                                           .attr('class', 'captcha')
                                       )
                                   )
                           return tr;
                       }($)
               );

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

Теперь самое интересное: реализовать возможность рисовать в canvas.
Главное — получить объект контекста canvas:
var ctx = canvas.getContext("2d");

А дальше для рисования линий нам понадобятся только эти методы:
beginPath(); //Для рисования линии этот метод должен быть вызван первым
moveTo(x, y); //устанавливает точку от которой начнется линия
lineTo(x, y); //устанавливаем точку к которой нужно провести линию
stroke(); //отрисовка линии

Осталось лишь правильно засунуть их в события mousedown, mouseup, mousemove, что мы и делаем, попутно выполняя ещё кое-какие действия:
           // Работаем только с элементами canvas
           this.find("canvas.captcha").each(function(i) {
               
               this.width = width;
               this.height = height;
               var ctx = this.getContext("2d");
               var elem = this;
               elCanvas[i] = elem;
               var drawing = false;
               pixCanvas[i] = createArrayPix();
               //биндим событие в своем пространстве имен
               $(this).bind("mousedown.nnCaptcha",function(e){
            //Получаем правильное координаты внутри canvas
                  var offset = $(elem).offset();
                  var x = e.pageX - offset.left;
                  var y = e.pageY - offset.top;
            //Заносим признак в бинарную матрицу этого canvas                               pixCanvas[i][x][y] = 1;
                  ctx.beginPath();
                  ctx.strokeStyle = options.selectedColor;
                   ctx.lineWidth = options.selectedWidth;
                   ctx.moveTo(x, y);
                   drawing = true;
                   elem.style.cursor = 'crosshair';
               });
               
               $(this).bind("mouseup.nnCaptcha",function(e){
                   
                   if (drawing)
                   {
                       var offset = $(elem).offset();
                       var x = e.pageX - offset.left;
                       var y = e.pageY - offset.top;
                       ctx.lineTo(x, y);
                       drawing = false;
                       pixCanvas[i][x][y] = 1;
                   }
                   
               });
               
               $(this).bind("mousemove.nnCaptcha",function(e){
                   
                   if (drawing)
                   {
                       var offset = $(elem).offset();
                       var x = e.pageX - offset.left;
                       var y = e.pageY - offset.top;
                       ctx.lineTo(x, y);
                       ctx.stroke();
                       ctx.moveTo(x, y);
                       pixCanvas[i][x][y] = 1;
                   }
                   elem.style.cursor = 'crosshair';
               });
               
           });

Вот теперь метод init нашего плагина готов, чтобы все заработало, добавим в плагин глобальные переменные и функцию:
    // значение по умолчанию
   var defaults = { selectedColor:'#000000',selectedWidth:1 };
   var countCanvas = 3;
   var elCanvas = [];
   var width = 100;
   var height = 100;
   var pixCanvas = [];
   
   function createArrayPix(){
       var a=new Array (width);
       for (i = 0; i < width; i++)
       {
           a[i]=new Array (height);
           for (j = 0; j < height; j++)
           {
               a[i][j] = 0;
           }
       }
       return a;
   }

Объясню зачем эти доп. действия, чтобы когда пользователь будет рисовать в канвазе, все координаты по которым рисовалось(ходила мышь), были занесены в бинарную матрицу — pixCanvas[Ncanvas][x][y] (“1” — координата “рисованая”, “0” — нет)
Конечно, куда проще было сделать сохранение картинки в канвазе в PNG c помощью метода:
canvas.toDataURL("image/png");

Он возвращает картинку канваза в base64, в виде data:URL, который можно было отправить на сервер и раскодировать, но получается при этом PNG картинку на сервере придеться ещё обрабатывать, чтобы получить входные данные на нашу нейронную сеть.
Проще на стороне клиента сразу создавать бинарную матрицу и примерно таким способом отправлять её на сервер:
ajax:function(n) {
           $.post("test.php", { matrix: JSON.stringify(pixCanvas[n]) } );
       }

Хотя конечно, можно обойтись и без ajax — создавать скрытый input на форме и json строку помещать там.
Вот теперь собираем весь код плагина вместе:
(function($) {

   // значение по умолчанию
   var defaults = { selectedColor:'#000000',selectedWidth:1 };
   var countCanvas = 3;
   var elCanvas = [];
   var width = 100;
   var height = 100;
   var pixCanvas = [];
   
   function createArrayPix(){
       var a=new Array (width);
       for (i = 0; i < width; i++)
       {
           a[i]=new Array (height);
           for (j = 0; j < height; j++)
           {
               a[i][j] = 0;
           }
       }
       return a;
   }
   
   // наши публичные методы
   var methods = {
       // инициализация плагина
       init:function(params) {
           // актуальные настройки, будут индивидуальными при каждом запуске
           var options = $.extend({}, defaults, params);
           //Вставляем в контейнер капчи заготовку table
           this.append('<table class="tbCaptcha"><tbody></tbody></table>');
           //Строим таблицу из 2 строк и countCanvas колонок
           this.find("table.tbCaptcha").find('tbody')
               .append(function($){
                           var tr = $('<tr>');
                           for (i=0;i<countCanvas;i++)
                               tr.append($('<td>')
                                       .append($('<img>')
                                           .attr('src', 'nnCaptcha.php?image=get')
                                       )
                               )
                           return tr;
                       }($)
               ).append(function($){
                           var tr = $('<tr>');
                           for (i=0;i<countCanvas;i++)
                               tr.append($('<td>')
                                       .append($('<canvas>')
                                           .attr('class', 'captcha')
                                       )
                                   )
                           return tr;
                       }($)
               );
           // Работаем только с элементами canvas
           this.find("canvas.captcha").each(function(i) {
               
               this.width = width;
               this.height = height;
               var ctx = this.getContext("2d");
               var elem = this;
               elCanvas[i] = elem;
               var drawing = false;
               
               pixCanvas[i] = createArrayPix();
               
               $(this).bind("mousedown.nnCaptcha",function(e){
                   var offset = $(elem).offset();
                   var x = e.pageX - offset.left;
                   var y = e.pageY - offset.top;
                   pixCanvas[i][x][y] = 1;
                   ctx.beginPath();
                   ctx.strokeStyle = options.selectedColor;
                   ctx.lineWidth = options.selectedWidth;
                   ctx.moveTo(x, y);
                   drawing = true;
                   elem.style.cursor = 'crosshair';
               });
               
               $(this).bind("mouseup.nnCaptcha",function(e){
                   
                   if (drawing)
                   {
                       var offset = $(elem).offset();
                       var x = e.pageX - offset.left;
                       var y = e.pageY - offset.top;
                       ctx.lineTo(x, y);
                       drawing = false;
                       pixCanvas[i][x][y] = 1;
                   }
                   
               });
               
               $(this).bind("mousemove.nnCaptcha",function(e){
                   
                   if (drawing)
                   {
                       var offset = $(elem).offset();
                       var x = e.pageX - offset.left;
                       var y = e.pageY - offset.top;
                       ctx.lineTo(x, y);
                       ctx.stroke();
                       ctx.moveTo(x, y);
                       pixCanvas[i][x][y] = 1;
                   }
                   elem.style.cursor = 'crosshair';
               });
               
           });
           
   
           return this;
       },
       
       test:function(n,x,y) {
           alert(pixCanvas[n][x][y]);
       },
       ajax:function(n) {
           $.post("test.php", { name: JSON.stringify(pixCanvas[n]) } );
       },
       
       // сброс
       reset:function(n) {
           //alert(n);
           if (n !== undefined){
               var c = elCanvas[n];
               var ctx = c.getContext("2d");
               ctx.clearRect(0, 0, c.width, c.height);
               pixCanvas[n] = createArrayPix();
           } else {
               $.each(elCanvas,function(i) {
                   var ctx = this.getContext("2d");
                   ctx.clearRect(0, 0, this.width, this.height);
                   pixCanvas[i] = createArrayPix();
               });
           }
       }
   };
   
   $.fn.nnCaptcha = function(method){
   
       if (this.length != 1) {
           $.error('not 1 element!');
           return;
       }
       // немного магии
       if ( methods[method] ) {
           // если запрашиваемый метод существует, мы его вызываем
           // все параметры, кроме имени метода прийдут в метод
           // this так же перекочует в метод
           return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
       } else if ( typeof method === 'object' || ! method ) {
           // если первым параметром идет объект, либо совсем пусто
           // выполняем метод init
           return methods.init.apply( this, arguments );
       } else {
           // если ничего не получилось
           $.error( 'Метод "' +  method + '" не найден' );
       }
   };

})(jQuery);

Конечно многое ещё “сырое”, и я постоянно все допиливаю, но идея думаю понятна. В живую работу плагина можно посмотреть тут. Ещё один «недостаток» этого кода, что он работает лишь в актуальных и современных браузерах (например, из-за того же canvas или «JSON.stringify()»), хотя при желании можно легко переделать всё под IE8- подобные браузеры…

Обобщение

Как показала дальнейшая практика, выбор квадрата 100х100 дает кол-во входов у нейронной сети — 10000, что довольно таки много. Скорее всего, квадраты для каптчи будут поменьше (да хотя бы 50х50), все будет зависеть от скорости обработки на сервере...

В качестве реализации нейронной сети в гугле я нашел «ANN — Artificial Neural Network for PHP 5.x».
Поначалу было интересно использовать “живой” пример реализации на PHP 5.3 с использованием неймспейсов, но когда я пытался обучить сеть с 10ю входами и 3мя выходами, это занимало больше 10 мин, представляю, сколько будет обучаться реальная выборка. В общем возможно придется даже тут изобретать свой велосипед. Можно конечно взять всем известную библиотеку FANN, но во первых она вряд ли дружит с PHP 5.3, во вторых на Windows откомпилированных решений нет (да и особо не нужно), а на хостинге хостер не дает поставить, но своего VDS пока нет. Да и если распространять каптчу, FANN придется занести в требования.
Хотя не обязательно привязываться к PHP на сервере, благо других серверных языков хватает...
Но вернемся к нашей каптче, понятное дело, что в таком виде она легко ломается ботами — достаточно отправить на сервер 3 “правильных” бинарных матриц (я уже не упоминаю про распознавание фигур, так как задача довольно проста). Хотя конечно на сервере можно исключить из результатов вероятности выше 0,95 (вряд ли пользователи рисуют как Пикассо и правильно нарисовать мышью может только бот), но всё же для надежности, я думаю, надо криптовать матрицу функцией с ключем, которую будет выдавать сервер (и не обязательно одной и той же), естественно в не читаемом и упакованном виде.
Теперь, если даже бот распознает правильно картинку — отправить на сервер правильную бинарную матрицу не сможет!
Дальше можно придумать ещё много чего:
  1. Искажение фигур которые надо нарисовать;
  2. Разные цвета в разных блоках;
  3. Защита по сессиям от перебора;
  4. Вложенные фигуры (а нарисовать одну надо);
и другие возможности.
Конечно уже то, что ответ формируется джаваскриптом, уже хоть какая защита от примитивных спам-ботов. Пока кто-то целенаправленно не займется взломом именно этой каптчи, вряд ли какой-то спам бот обойдет её, особенно если предусмотреть при взломе замену/перебор крипто-алгоритма (каких можно придумывать великое множество).

Заключение

Статья получилось, конечно, сырой, все-таки процесс написания каптчи ещё идет и в голове постоянно возникают новые мысли. Так что эта статья точно не последняя, и я готов выслушать ваши комментарии и предложения по усилению защиты каптчи, “правильной” реализации, а так же по методам её взлома.

P.S. Картинки на каптче нарисованы в Paint'e просто для примера! Алгоритм генерации ещё не придуман.
Share post

Similar posts

Comments 73

    +44
    Рисовать мышкой несколько фигур — это геморой для реального человека, а для робота это обойти и автоматизировать распознавание конечного набора простых фигур довольно просто. В итоге капча опять не выполняет своего назначения: затрахивает пользователей и не защищает от ботов.
      +9
      Попытался нарисовать на тачпаде — я никогда такой тест не пройду (:
        +9
        Я вообще не понимаю кто тачпад придумал — садист какой-то. Никогда не научусь им пользоваться без ложных срабатываний.
          0
          Как-то, 2 года назад у меня сломалась мышь. Сначала ругался на неудобный тачпад, но всё было лень купить новую, да и хотел хорошую беспроводную, а на неё денег было жалко.

          В итоге через пару месяцев я привык, и вот уже 2 года юзаю исключительно тачпад, и не нужна мне никакая мышка, работаю быстрее чем с мышкой =)
            0
            хех. Когда я осваивался с тачпадом на свежекупленном ноуте — лучшей тренировкой было прохождение кримсонленда на харде. С тех пор проблем с тачпадом нет вообще)
              0
              мсье знает толк в извращениях
          • UFO just landed and posted this here
              0
              Для начала трекбол найти ещё надо :)
                0
                И это минус. Мне трекбол на моей старой Toshiba 8100 очень и очень нравился. Удобно.
                  0
                  Мне тоже, у меня был Compaq Armada 1120T с трекболом, это было офигенно.
              0
              Зато на таблетке это реализуемо )
              0
              На iPad2 пример не завелся — посещением меньше.
              +10
              Зря вы к пикселям привязываете входы. Получается неинвариантность относительно масштаба, искривления, поворота.

              По существу — капча должна усложнять жизнь ботам. Ваша капча усложняет жизнь в основном людям. Почему бы боту не очистить капчу от шумов и не перерисовать? Даже распознавать ничего не надо, по сравнению с обычной капчей.

              Вариант: просите человека нарисовать «треугольник» или «круг». И распознавайте любой треугольник или круг. Например посчитав количество углов и подав их как один из входов. А еще лучше составить одномерный массив из точек в порядке рисования и провести БПФ например. Много про это написано, уж тут точно велосипед изобретать не надо.
                0
                Ну да, идея в этом и состоит, что «рассказать» пользователю, что ему надо нарисовать, не обязательно это изображения, которые, как тут упоминают, легко распознать. Например, в одном изображении наложение сразу нескольких фигур, а нарисовать пользователю предлагается только одну. По моему нарисовать простые 3 фигурки мышкой все же проще, чем разбирать/подбирать reCaptch'y.
                  +2
                  Две странички. На одной ваша капча, на второй рекаптча. Поставьте простейший таймер на js. Потом попросиет людей разного возраста и разного уровня владения компом «разгадать» капчи на обеих страницах.
                  (для чистоты эксперимента ничего им не рассказывайте про свою капчу заранее)
                  Что то мне подсказывает что с reCaptcha они справятся наоборот быстрее
                    0
                    Ну так это из-за эффекта массовости, конечно любая каптча с полем для ввода уже прижилась и понятно что надо с ней делать. По моему дело привычки, нарисовать 3 фигуры можно за 5 секунд. Никто ж не просит пользователя нарисовать идеально ровный круг, поэтому я и решил применять нейросети для распознавания каракуль от пользователя.
                  –2
                  Насчет масштаба согласен, на разных масштабах придется переобучать сеть, а так обучать же сеть надо не на идеальных кругах, а на реальных «рисульках», тогда как не нарисуй на выходе мы будем иметь или круг или квадрат или треугольник или ничто…
                    0
                    Логично.
                    Лучше писать нечто типа «Нарисуйте круг внутри овала».
                    А принимать картинку на вход — хорошая идея, впринципе. Вот только технологии еще не доросли — рисовать мышкой/тачпадом/трекболом жутко неудобно, а требовать от пользователя наличия сенсорного экрана или светового пера на данный момент просто нереально.
                    +9
                    Вы всё перепутали. Каптча — это некая задачка, решение которой тривиально для человека, и соответственно нетривиально для компьютера.
                    Компьютеру не составит труда идеально скопировать изображение (при необходимости внести помехи), а вот для человека рисовать мышкой круги — не так уж и легко (по крайней мере сложнее чем ввести текст).
                      +1
                      Хотя я недопонял идею сразу, так просто не скопируешь…
                      Но все равно, не вижу преимуществ перед текстовой каптчей.
                        +5
                        А недостатки есть, например слабая поддержка мобильных девайсов. Или гемморой для людей, лишенных мыши (таким был одно время и я).
                      +3
                      Цвет контура фигуры отличается от цвета помех. Слишком просто для автоматики
                        0
                        Ну как бы картинка нарисована в Paint'e просто для примера. Сама идея — это наверху просить пользователя вводить внизу фигуры, можно на изображении вставить текст + фигурку, вложить фигуры и стрелочкой показать какую нарисовать в общем на сколько хватит фантазии, лишь бы подключить абстрактное мышление человека!
                          0
                          Лучше заставлять не фигуры рисовать, а текстовые задачки из учебника математики 2-3-го класса дать :-)
                            0
                            Только вот генерировать их — увы! — задача, сложность которой сравнима со сложностью распознавания семантики и решения.
                        +1
                        Поддержку roman_tik далеко не массовое решение, удобство очень спорное проблем с реализацией много.
                        По-моему тут исходную спам ботам будет легче исходную картинку распознавать нежели самому человек её вырисовывать
                          +1
                          Вы действительно считаете, что такая капча не может быть автоматически взломана?
                            0
                            Конечно же нет. На этот счет я не питаю иллюзий. Всё, что сделано руками человека, им же может быть и сломано.
                            А вот криптования ответа от пользователя (в каптче) я точно ещё нигде не встречал. Обычно под взломом каптчи подразумевают распознать ответ, который надо отправить на сервер в открытом виде и каптча взломана.
                            А в такой каптче правильного ответа уже будет не достаточно для отправки на сервер…
                              +1
                              Криптование ответа пользователя совершенно бесполезно, оно ничуть не усложняет задачу роботам.
                                0
                                А в чем конкретно криптованность?
                              +1
                              По-моему Вы только усложнили задачу распознания ввода пользователя серверной стороной.
                              Боты будут делать более правильные фигуры, чтобы их (фигуры) надежнее принимались сервером.
                              А криворукие пользователи типа меня будут гневно материться.
                                –1
                                Да, согласен, нагрузка на серверную часть несомненно вырастет.
                                Я ж в статье написал, что слишком правильные фигуры можно легко отсекать. Другое дело что умный бот, не будет слать правильную фигуру. Тут уже дело правильного обучения сети. Вот как закончу, посмотрю на результат, тогда можно делать выводы будет…
                                +4
                                Месье знает толк в извращениях
                                  +2
                                  Мне кажется, такие капчи подбирать очень легко. В каждом поле может нарисовать 3 фигуры, за максимум 27 попыток подберет. Надо добавлять еще фигуры, но не заставлять же пользователя рисовать объемный прямоугольный параллелепипед.
                                  • UFO just landed and posted this here
                                      +44
                                        +2
                                        … после того как нарисуете, нажмите кнопку «отправить». Ваши рисунки рассмотрят наши эксперты в течении шести месяцев и вынесут вердикт о правдоподобности ваших картинок.
                                          +2
                                          Если ваш рисунок признают оригиналом, то вы богаты!
                                          0
                                          Мне кажется, только один человек сможет попасть на этот сайт. И тот умер :(
                                          0
                                          Знаю, что это ещё не релиз версия, но даже эта глючновата :) Случайно наткнулся на интересный баг — www.youtube.com/watch?v=D9uJY0J2tLk
                                            0
                                            Тоже удалось его повторить:
                                            Если зажать ЛКМ -> нарисовать -> вывести курсор за область рисования -> отпустить ЛКМ -> нажать очистить, то после заведения курсора на поле рисования будет проявляться старый рисунок.
                                            +3
                                            А как удобно делать DDoS :P
                                              0
                                              Если браузер может отправить, то и бот сможет отправить на сервер разгаданную капчу, тем более, что алгоритм налицо.
                                                0
                                                Это такая капча наоборот получается: я чё-нибудь нарисую, а система пускай угадывает — что именно. Всегда об это мечтал!
                                                  –2
                                                  Я считаю, что самая устойчивая и удобная человеку капча это 3D капча www.seosmarty.com/wp-content/uploads/2009/05/captcha-5.jpg
                                                    0
                                                    <сарказм>
                                                    очень удобно
                                                    </сарказм>

                                                    Насколько я помю — кто-то выкладывал статью на тему, что тремерные капчи ничуть не сложнее двумерных в распознавании.
                                                      0
                                                      И какие же там буквы нарисованы? Я так и не понял…
                                                        0
                                                        Я выбрал пример наугад, трёхмерных капч много. Суть в том что распознать что-то в пространстве я считаю роботу не под силу.

                                                        В капче нарисованы буквы: VMBK
                                                          0
                                                          мы видим это как «в пространстве», а боту фиолетово на это пространство)) ну наклонены буквы посильнее чем обычно)
                                                            0
                                                            А в чем сложность? Применяем афинные преобразования, получаем проекцию сверху и распознаем. Кстати, параметры букв в пространстве не меняются, а хорошие нейронные сети инвариантны к пространственным преобразованиям.
                                                        0
                                                        На мой взгляд, вот эта каптча SQ-PIX достаточна интересна. Есть что перенять оттуда.
                                                          0
                                                          Тоже на iOS не заработала.
                                                          +3
                                                          Самый оригинальный вариант капчи, который я когда-либо видел:
                                                          image
                                                          Тут далеко не каждый человек разберет.
                                                          Не уподобляйтесь, пожалуйста, в погоне за оригинальностью.
                                                            0
                                                            148
                                                              0
                                                              На hidden-3d.com капчи не генерятся динамически, т.е. опеределённому набору картинок соответствует набор чисел в базе. Может оно и оригинально, но бесполезно: на час работы, чтоб собрать базу соответствий, чтоб потом по ссылке на картинку выдавать нужное число.
                                                                0
                                                                Возможно, реализация динамической генерации для этого варианта трудоемка, но не думаю, что невозможна. Я вообще не к тому говорил, что ее подобрать можно, а к тому, что вероятность правильного ввода подобной капчи человеком далека от 100%, мало кто на самом деле умеет такие картинки смотреть. Скриптом по словарю перебрать — это, кстати, интересная мысль.
                                                                0
                                                                Решительно ВСЁ, что можно сохранить в виде картинки или куска html, автоматизируется ботом отправкой индусам, разгадкой их операторами по 500 штук за 1 доллар и отправкой на сервер готового решения.

                                                                Автору настоятельно рекоммендую нечто динамическое, например, вести мышкой за летающей по канвасу мухой. Хотя и это можно автоматизировать.
                                                                  0
                                                                  Выходит надежной капчи не существует)… остается капча только ввиде какого нибудь реального задания, что-то вроде «Сфотографируйтесь рядом со своим котом лежа спине в позе лотоса, и пришлите нам в специальную форму, с числом в углу, которое вы указали при регистрации, наши эксперты рассмотрят ваше изображение и вынесут вердикт о том что вы реальный человек а не Бендер робот»
                                                                    +2
                                                                    так это же восстановление аккаунта в контакте!
                                                                      0
                                                                      Было дело?)
                                                                      0
                                                                      Мне известно два метода взлома нормальной каптчи захват изображения/звука/флеша с последующей передачей:
                                                                      — сложному алгоритму, пытающемуся её разгадать;
                                                                      — индусам для разгадки.

                                                                      Идея с рисованием по канвасу уже очень неплоха, хотя всё ещё подвержена обоим способам. Интерактивное воздействие (как в моём примере с мухой), наверняка, подвержено первому способу, но уже не второму.
                                                                      Если не будет грызть совесть, что индусы остались без крошки хлеба, можно попробовать пойти в эту сторону.

                                                                    0
                                                                    Уже обсуждалась на хабре, проста для компьютера и сложна для некоторых людей, которые не могу смотреть стереокартинки. Какие либо шумы тут придумать сложно, остается идея использования третьего фона, который видят процентов 10 всех людей, (сам лично видел только на одной кратинке, очень сложно всматривался минут 15), т.е. погружение в стрееокартинку, из той которую вы уже видели… выходит эффект картинки в картинки, но тоже не вариант из — за сложности.
                                                                    +1
                                                                    «Хотя конечно на сервере можно исключить из результатов вероятности выше 0,95 (вряд ли пользователи рисуют как Пикассо и правильно нарисовать мышью может только бот)»
                                                                    Допустим бот распознает эти самые 0.95, тогда что мешает ему же добавить небольшие шумы/искажения? Теперь уже не только сервер защищается от ботов, но и бот от хитрожопства сервера.

                                                                    «но всё же для надежности, я думаю, надо криптовать матрицу функцией с ключем, которую будет выдавать сервер (и не обязательно одной и той же), естественно в не читаемом и упакованном виде.
                                                                    Теперь, если даже бот распознает правильно картинку — отправить на сервер правильную бинарную матрицу не сможет!»
                                                                    Да что вы говорите =) Если криптует клиент, значит ничто не мешает поковыряться в коде и выяснить алгоритм, а далее прогнать распознанную картинку(матрицу) этим алгоритмом, или (если всегда алгоритмы разные), сделать что-то на основе WebBrowser(или любую другую вариацию исполнения JS кода).

                                                                    В итоге опять получаем ещё более уязвимую капчу, т.к. если очень сильно искажать фигуры и много шума- пользователь их не нарисует(или нарисует так же криво, как и видит), и соответственно не пройдет тест, а если при сравнении результата пользователя и исходной картинки выставить очень мелкие коэффициенты сходства — тогда ботам будет проще распознавать(достаточно будет выбрать допустим все черные пиксели, а остальные — убрать).
                                                                      0
                                                                      Что мешает вместо распознавание каптчи «в лоб» нейронными сетями (боту) сделать модель вносимых шумов (можно даже нейронную), убить их и отправить исходную картинку? Каждое из действий не особо сложно.
                                                                      И еще. Ваше решение совершенно не масштабируется. Если Вы увеличите количество примитивов на картинке — особого эффекта это не принесет, потому что чтобы распознавать ответ на сервере, картинка должна легко резаться на отдельные примитивы, в противном случае (примитивы пересекаются, показываются частично и т.п.) сеть должна иметь гораздо более сложную структуру и обучаться на других примерах, что не оправдано для поставленной задачи.
                                                                      P.S. 10 минут на обучение нейронной сети… Я могу о таком только мечтать
                                                                        0
                                                                        Я совсем не знаток капч и их уязвимостей, но разве обычная капча в виде текстовых вопросов (составленных непосредственно разработчиком/администратором сайта) обходится ботами? И если обходится, то как? P.S. на гугле не забанен, но всё равно откопать ответ не вышло.
                                                                          0
                                                                          Зависит от каптчи. Стандартные типа «введите слово на картинке» ломаются обычно нейронными сетями или с помощью специальной мат. модели (шумоустойчивыми распознавателями текста и т.п.). Общих методов мне не известно, ибо задача требует воспроизведения интеллектуальных усилий.
                                                                            0
                                                                            Нет, я имел ввиду немного другое. Например на одном из моих форумов (музыкальной тематики), капча ввиде вопросов: «Назовите одну из самых популярных шведских групп».
                                                                              0
                                                                              Эти тоже обходятся, есть весьма продвинутые методы анализа текстов, включающие выделение отношений между членами предложения. Так что взломать возможно. Но я не встречал в инете ресурсов, защищенных капчой, содержание которых оправдывало бы применение столь сложных методов анализа. Тем более, что всегда есть обходные пути получить их содержание
                                                                          +1
                                                                          Идиотизм, честное слово.
                                                                          Мне одному кажется, что аутентификация пользователя (или подтверждение важного действия) оптимально должна производится по отпечатку пальца?
                                                                            0
                                                                            Капча может использоваться только как часть процесса аутентификации.
                                                                            > аутентификация пользователя (или подтверждение важного действия) оптимально должна производится по отпечатку пальца
                                                                            На интернет-сервисах? А почему не по сетчатке глаза? И основную задачу каптчи — проверку, что пользователь есть Homo sapiens — это не решает
                                                                            0
                                                                            Всем спасибо за комментарии, написал вторую часть статьи — исправленную. К сожалению не хватает кармы опубликовать (4/5).
                                                                              0
                                                                              Увидел на одном блоге интересную капчу. Ребята сказали их разработка и скоро выложат в паблик бесплатно.
                                                                              Вот пример.
                                                                              jacksoft.biz/wp-login.php
                                                                              а тут они ее будт выкладывать (сайт в разработке).
                                                                              icecaptcha.com/
                                                                              Взял у них плагин к вордпресу — на днях поставлю себе.
                                                                                +1
                                                                                Сходу отвечаю, как обходится первая капча.
                                                                                1. Выделяем контуры изображения, например фильтром Собеля. Бинаризуем.
                                                                                2. С помощью алгоритма Хафа находим окружность.
                                                                                3. Имитируем клик в районе центра окружности.

                                                                                По второй примера не нашёл, зато забавно видеть спам на форуме этой «крутой» капчи :)

                                                                              Only users with full accounts can post comments. Log in, please.