Есть сайт одной местной организации, на котором мне надо было найти кое-какую информацию. Сайт сделан на какой-то старой версии Joomla. Хотя, это в принципе свойственно государственным учреждениям или небольшим организациям. Пилить однотипные сайты, вылизывая друг у друга шаблон и меняя только логотип и цветовую палитру.
Создавать сайты на CMS честно говоря, полная халтура и меня очень раздражают все эти "готовые решения" - CMS, типа: Joomla, InstantCMS, WordPress, DLE и т. д. Хотя я сам когда-то делал сайт на DLE (чья бы корова мычала). Да, есть такой грешок. Но и винить людей я не могу. Это их дело на чем они будут создавать сайт.
Скажу честно, свой блог я хотел запилить на WordPress. Но, так как я не умею работать с WP и мне лень было изучать структуру и код этого движка, я решил выбрать Laravel и сделал все с нуля.
Итак! Поговорим о "самой дешевой капче в мире". Зайдя на этот сайт, я наткнулся на форму обратной связи. За все время сколько я сижу в интернете, я не видел настолько чмошной капчи, как на этом сайте. У меня нет сомнений, что-то разработчик, который создал эту капчу, имел на одну хромосому больше обычного человека.
Мне нравится проводить анализ чужого кода. Бывает, что можно найти интересные авторские решения (и стырить их). Раз уж я решил запустить еще одну рубрику на своем блоге "АнализКода", в качестве первой статьи, я расскажу про эту капчу. Начнем с плюсов этой капчи.
Начнем с того, что можно провести атаку даже без ввода капчи. Серверу без разницы, прислали вы капчу или нет. Результат - "Благодарим за обращение!".
Первым делом проверим HTML код.
Как вы можете заметить, капча биндится через document.write()
. Если приглядеться внимательней, то имеются две переменные a
и b
. Если мы можем их вставить через document.write()
, это значит, что переменные доступны глобально.
Давайте попробуем вывести значения этих переменных в консоли.
То есть, мы можем получить или изменить эти значения. Пошарив исходный код, наткнулся на файл captcha.js
в котором лежит код проверки капчи. Там же, есть главная переменная code
с верным результатом.
_30function trim(str) {_30 var str = str.replace(/^\s+|\s+$/g,"");_30 return str;_30}_30function ValidCaptcha(a,b){_30 var a = trim(a);_30 if (a == b){_30 return true; _30 }_30 return false;_30}_30function checkform(theform, b){_30 var why = "";_30 var a = theform.input.value;_30 if(a == ""){_30 why += "Security code should not be empty.\n";_30 }_30 if(a != ""){_30 if(!ValidCaptcha(a, b)){_30 why += "Security code did not match.\n";_30 }_30 }_30 if(why != ""){_30 alert(why);_30 return false;_30 }_30}_30var a = Math.ceil(Math.random() * 9);_30var b = Math.ceil(Math.random() * 9);_30var code = a + b;
Генерируются 2 случайнах числа a
и b
. Эти два числа складываются и результат сохраняется в переменной code
.
Функция trim()
избавляется от лишних пробелов в начале и в конце строки. Наверное для того, чтобы пользователь не напихал лишних пробелов. Как все продуманно! Думаю нативный метод String.trim(), который делает то же самое, автор не использовал из-за принципа. Молодец!
Функция ValidCaptcha()
сверяет code
с тем результатом, который ввел пользователь. Ну и checkform()
проверяет, может ли форма отправиться или нет.
Подменив значение в code
, форма успешно отправляется.
Это все круто! Однако, зачем я написал эту статью? Это никакой не разгром и реверс инженеринг. Статью писал исключительно в ознакомительных целях. Рассказать, что такая "защита" не имеет никакого смысла, если логика выполняется только на клиентской стороне.
Обычным JS можно сотворите такие штуки, что и в голову не может прийти (кэп). Ну, к примеру, забить их почту кучей сообщений и возможно, что хостинг их за это заблокирует.
И конечно, самый лучший вариант - reCaptcha от Google.