Как я делал нотную капчу

Однажды в далеком 2009 году я делал сайт для музыкантов. Единственным средством обратной связи на сайте была гостевая книга. Чтобы не пустить ботов, спамеров и нехороших людей, нужна была капча. Так как сайт для музыкантов, то я подумал, пусть капча тоже будет музыкальной.

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


или так:



Ноты нужно распознать и выбрать соответствующие в четырех (по количеству нот) выпадающих списках:


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

На сервере генерируется картинка из (псевдо)случайно выбранных четырех картинок нот и пауз. Имена картинок — цифры от 0 до 13 + расширение (png) — соответствуют номеру позиции ноты на нотном стане, начиная от нижней добавочной. Ключ тоже случайный — басовый или скрипичный. Чтобы понять, что нота означает в текущем ключе, был сделан такой конвертер:

<?php
function scrip_href($x){
	switch( $x )
	{
		case 0:  $x1=0; break;
		case 1:  $x1=1; break;
		case 2:  $x1=2; break;
		case 3:  $x1=3; break;
		case 4:  $x1=4; break;
		case 5:  $x1=5; break;
		case 6:  $x1=6; break;
		case 7:  $x1=7; break;
		case 8:  $x1=1; break;
		case 9:  $x1=2; break;
		case 10: $x1=3; break;
		case 11: $x1=4; break;
		case 12: $x1=5; break;
		case 13: $x1=6; break;
	}
	return $x1;
}
function bass_href($x){
	switch( $x )
	{
		case 0:  $x1 = 0; break;
		case 1:  $x1 = 3; break;
		case 2:  $x1 = 4; break;
		case 3:  $x1 = 5; break;
		case 4:  $x1 = 6; break;
		case 5:  $x1 = 7; break;
		case 6:  $x1 = 1; break;
		case 7:  $x1 = 2; break;
		case 8:  $x1 = 3; break;
		case 9:  $x1 = 4; break;
		case 10: $x1 = 5; break;
		case 11: $x1 = 6; break;
		case 12: $x1 = 7; break;
		case 13: $x1 = 1; break;
	}
	return $x1;
}
?>


Дальше все просто — генерируем ключ и ноты:
<?php
mt_srand( time() + (double)microtime()*55 );		
$n  = mt_rand(1, 2);
$n1 = mt_rand(0, 13);
$n2 = mt_rand(0, 13);
$n3 = mt_rand(0, 13);
$n4 = mt_rand(0, 13);
?>


Конвертируем то что получилось во что-то понятное:
<?php
if( $n == 1 ){
	$x1 = scrip_href($n1);
	$x2 = scrip_href($n2);
	$x3 = scrip_href($n3);
	$x4 = scrip_href($n4);
}
elseif( $n == 2 ){
	$x1 = bass_href($n1);
	$x2 = bass_href($n2);
	$x3 = bass_href($n3);
	$x4 = bass_href($n4);
}
?>


Затем остается только записать получившийся код в сессию, склеить и отдать картинку.

Таким образом, в сессии у нас записаны реальные номера нот (пауза=0, до=1, ре=2, и т. д.), а пользователь видит забавную капчу.

Спасибо, что дочитали до конца.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 79

    +45
    Решение интересное. Даешь тематическую каптчу для всех сайтов.
      0
      Угу, на форуме программистов давать кусок псевдокода и просить ввести конечный результат.
        +14
        боюсь, что же надо будет делать на сайтах посвященных патологоанатомии
          +57
          И порносайтах.
            +6
            угадайте актриссу
              +8
              При этом лицо в капче отсутствует
          +24
          Лучше просить найти ошибку. Тогда можно по аналогии с рекапчей, рефакторить код нашару :)
            +4
            Попадались мне сайты по радиоэлектронике, где вместо капчи либо фотографии деталей/приборов даются и надо ввести их название, либо кусок схемы и необходимо рассчитать, например, сопротивление резистора.
              0
              Написать номинал по полоскам на резисторе — по-моему очевидное и лежащее на поверхности. Даже удивительно, что еще никто не сделал.
                +2
                ломается на ура, равно как и капча автора поста
                  +1
                  Только обычные боты ломать не будут ради одного сайта.
                  +1
                  Я хоть и посещаю форумы по электронике, но цветовую маркировку на память не знаю, а вот бот цвета разберет в момент.
                    +1
                    Даже на фотографии с россыпью деталей и подписью «укажите номинал резистора на 0,5W» ;)
                      +1
                      Капчи с определением радиодеталей очень полюбят ардуинщики, которым глубоко до лампочки как выглядит резистор, ибо они зашли спросить у форумчан какими регистрами запустить ШИМ.
                  +1
                    0
                    В качестве каптчи — схема и вопрос: если перевернуть транзистор D на 180 градусов, как изменится напряжение на сопротивлении R?
                  +5
                  Думаю, разгадывать результат работы кода для программы будет попроще)
                    0
                    int i = 5;
                    i = ++i + ++i;
                    

                    Вопрос: Чему равно i?
                      0
                      14
                    0
                    Решение очень интересное, потому что я даже с мануалом с трудом разгадаю такую капчу :)
                      +32
                      Хороший способ убрать с сайта _левых_ людей
                      +18
                      Представляю, как эту капчу ненавидят полуграмотные гитаристы, которые только гитарными табулатурами владеют ))
                        +1
                        Или вообще 3 блатных аккорда только знают (Am, Em, Dm)
                          +6
                          Три блатных — Am, E, Dm )
                            +5
                            Am, Dm, E
                            0
                            видимо это ещё и упёртые гитаристы, потому что для решения этой каптчи можно открыть любую картинку типо этой gitarre.ru/UserFiles/Image/pages/lessons/notes_tab.gif или любой самоучитель по игре на чём угодно.
                          0
                          Хотелось бы посмотреть на работающий пример.
                            +1
                            Отправил вам в ЛС
                            +7
                            Тоже мне хардкор. Надо чтобы записанную мелодию нужно было пропеть в микрофон. Или хотя-бы проиграть на виртуальной клавиатуре. Или еще интереснее — проигрывается мелодия, а пользователь ее нотами записывает. Желательно суровое многоголосье.
                              +2
                              упростим задачу. насвистеть.
                                +7
                                После трех провальных попыток напеть или просвистеть мелодию вход блокируется и разблокировать его можно только спев хором! Вот это было бы круто)))
                              +1
                              Окей. Myst. The Neverhood. Metal Mutant.

                              Кто хочет, пусть продолжит список. Так как хороший слух не у всех, обычно ограничиваются одной октавой или даже очень-очень далеко разнесёнными нотами, вроде пяти нот на две октавы. У меня-то слух плохой, поэтому на подобные задания я плююсь.
                                0
                                The Neverhood.
                                Именно на этом задании я там и сломался.
                                  +1
                                  Точно, Metal Mutant. Вот гадство-то было…
                                    0
                                    В Myst задача такова: пять нот, три октавы, и рояль в качестве эталона. Надо настроить пять ползунков на эти ноты. Хорошо, что был обходной путь: считать щелчки.
                                    0
                                    0
                                    Точно! Чтобы зарегистрироваться на сайте, нужно написать полифонический диктант!
                                      0
                                      А я видал сайт для ремонтников. Чтобы зарегистрироваться, надо пройти тест: начиная от школьной электротехники и заканчивая опознанием узла стиральной машины.
                                    +5
                                    Я за вариант с угадай мелодию.
                                      0
                                      Это красиво, но очень просто ломается, даже если запись с добавлением шума.
                                        +1
                                        Я про ту что с Пельшем: «А я угадаю эту мелодию с 5 нот». Без шансов для soundhound и им подобным.
                                          0
                                          Будет как с канзикапчей на имижбордах, куча постов «я угадал!» и ничего больше.
                                            0
                                            Канакапчей! Для кандзикапчи надо свободно знать японский/китайский.

                                            Это разные вещи.
                                              +2
                                              Во-во. Канакапча простая, а канзикапча, особенно если запихать весь словарь первого уровня, может быть импощибиру даже для знающих язык.
                                      +1
                                      Интересное, но уж больно узконаправленное решение. Это скорее способ оградить сайт от «лишней» аудитории.
                                        +10
                                        Решение интересное. Хотя, если на сайт зайдет нехороший программист, хоть немного знающий музыкальную грамоту, то взломать эту капчу ему не составит никакого труда. Кстати, функцию scrip_href() можно упростить:

                                        function scrip_href($x) {
                                            return $x < 8 ? $x : $x - 7;
                                        }
                                          +6
                                          > Хотя, если на сайт зайдет нехороший программист, хоть немного знающий музыкальную грамоту, то взломать эту капчу ему не составит никакого труда.

                                          В самопальных решениях куда важнее принцип неуловимого Джо: целевая атака, конечно, пробьёт, но вот широкополосная (которая, например, мочит по стандартным капчам WordPress или PHPBB) пройдёт мимо.
                                            +1
                                            А для такой достаточно любой не стандартной защиты, пользователь даже не заметит, и не будет никакой каптчи. Здесь идея интересна тем, что не целевую аудиторию отшиваем.
                                          +13
                                          Ваши длинные конвертеры из switch'ей, я бы заменил на такие, более короткие:
                                          function scrip_href($x) {
                                          	return $x % 8 + ($x >= 8 ? 1 : 0);
                                          }
                                          function bass_href($x) {
                                          	$t = $x % 7 + 2;
                                          	return $x == 0 ? 0 : ($t == 8 ? 1 : $t);
                                          }
                                          
                                            0
                                            Спасибо, взял на заметку
                                              +1
                                              А Ваши тоже можно заменить на чуть более лаконичные:
                                              function scrip_href($x) {
                                                  return $x % 8 + (int) ($x >= 8);
                                              }
                                              function bass_href($x) {
                                                  $t = $x % 7 + 2;
                                                  return $x === 0 ? 0 : ($t !== 8 ?: 1);
                                              }
                                              
                                                +2
                                                упс, второе у меня неверно — результатом тернарного выражении будет всегда 1, поспешил :(
                                                  +4
                                                  Второе будет:

                                                  return $x ? 1 + ($x + 1) % 7 : 0;
                                                  
                                            • UFO just landed and posted this here
                                              • UFO just landed and posted this here
                                                  0
                                                  Такая капча не для большинства, очевидно же. Для специализированных сайтов или форумов.
                                                    0
                                                    Совершенно верно. Есть Optical Music Recognition. Нотная запись по картинке распознается уже давно не хуже, чем обычный текст.

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

                                                    Интересный, на мой взгляд, вариант капчи мог бы быть в рендеринге трехмерных объектов. Распознать объект по фотографии в общем случае — сложная задача, и решена она более-менее хорошо лишь для узких классов объектов, таких как лица.
                                                    +2
                                                    Нотная капча была еще в старинной игре Loom :)
                                                    • UFO just landed and posted this here
                                                        0
                                                        Там главное понять, что не обязательно каждый раз фонтан включать (да, тут я тупил когда-то :) ). А вообще — тупо перебор, За 20 минут можно все варианты перебрать.
                                                        0
                                                        Была ещё игрушка Cyberia, где в одном месте надо было на слух угадать код к двери (там каждая кнопка разной нотой звучала и можно было подслушать, как кто-то проходит, а потом самому попытаться).
                                                          +1
                                                          Этот эпизод был в Cyberia 2. Помню, в детстве на этом эпизоде я и застрял (даже пытался на диктофон записывать звуки). Уже гораздо позже прошел его с первых попыток (правда, застопорился сразу в следующей комнате, уже не помню что там было).
                                                        +1
                                                        Идея неплоха, такая капча хорошо отобъет обычных ботов, да и китайцев тоже. Будучи музыкантом, мне было бы намного приятнее разгадывать такую капчу, чем тупо вводить цифры с картинки.

                                                        Единственный ее минус, на мой взгляд, — ее очень легко научиться програмно распознавать. Распознавать нотный стан очень легко после того как поймешь принцип его «построения». Я даже когда то хотел написать конвертер своих картинок с нотными листами в формат gtp (кто не знает программа для редактирования гитарных табулатур), но тогда я уперся в отсутствие описания данного формата.

                                                        А так — да, профильная капча на сайте выглядит намного приятнее, да и заодно это хороший способ снизить количество «левых» людей.
                                                          0
                                                          Если бы ещё не приходилось раскрывать списки для выбора ответа. Может быть стоит сделать уже раскрытые списки, тогда выбор сводится к одному клику. Вы этим сильно упростите ответ.
                                                            +1
                                                            Неудобно 4 списка открывать. Лучше капча в виде нотных аккордов, а ответы в виде «радиокнопок».
                                                              0
                                                              Капча клевая, для тематических сайтов — самое оно.
                                                              Но, как уже, говорили выше, выпадающие списки для такой капчи — это плохо. Можно заменить либо на уже раскрытые списки, либо на обычное поле ввода, и распознавать строки вида «FpFA» (первая капча), «ми-си-ми-фа» (вторая капча).
                                                                +1
                                                                Смысл любой капчи — в сложности распознавания ее роботом. В вашем случае капча распознается компьютером без особых усилий (разрезать картинку на 5 частей и проверить совпадения).
                                                                Я бы рекомендовал Вам строить ноты в 3D и рендерить получившуюся картину под разными углами. Добавление при этом нескольких эффектов сильно бы усложнило задачу ботам.
                                                                  +1
                                                                  и людям
                                                                  никто не будет писать специализированный код под эту капчу чтобы предложить заветный enlarge музыкантам
                                                                  а вот под капчи различных CMS и сервисов код уже написан, поэтому пока ты неуловимый джо — любая нестандартная капча работает на тебя, а если ты популярный ресурс — защита одной капчей тебе не поможет
                                                                  0
                                                                  Всегда играл на флейте и терпеть не мог басовый ключ! :)
                                                                    +1
                                                                    Не очень удобен выбор по выпадающим списком, надо бы как-то одной кнопкой обойтись.Например — нотами изображена мелодия, ниже выбор: пара кнопок проигрывает что-либо и надо на слух найти совпадение, или сразу приводится название произведения откуда мелодия.
                                                                      +1
                                                                      Выключать остальную музыку в угоду прослушивания капчи? Сколько человек вернется на этот сайт?
                                                                      +4
                                                                      Сейчас подумал, что тут будет неплохо смотреться волновое искажение, которое сделает капчу немного более стойкой:
                                                                            
                                                                        +1
                                                                        Ох, в глазах поплыло! :)
                                                                          0
                                                                          И разметку убрать, чтоб надёжней было )))
                                                                          +3
                                                                          Теперь ждем на хабре статью «Как я взломал нотную капчу»
                                                                            0
                                                                            А Джимми Хендрикс, говорят, нотной грамоты не знал. :)
                                                                              0
                                                                              [deleted]
                                                                                0
                                                                                Чтобы зарегистрироваться в электронной библиотеке Физтеха, нужно решить задачку на нахождение сопротивления цепи:
                                                                                http://lib.mipt.ru/users/registration
                                                                                Задача, кстати, не из простых)

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