Нет, ты знаешь Canvas!

Дата: 12.09.2017 в 11:45, Категория: Жизнь блога
  • 737
  • 9
Нет, ты знаешь Canvas!

Есть сайт одной местной организации, на котором мне надо было найти кое-какую информацию. Сайт сделан на какой-то старой версии Joomla. Хотя, это в принципе свойственно государственным учреждениям или небольшим организациям. Пилить однотипные сайты, вылизывая друг у друга шаблон и меняя только логотип и цветовую палитру.

Создавать сайты на CMS честно говоря, полная халтура и меня очень раздражают все эти "готовые решения" - CMS, типа: Joomla, InstantCMS, WordPress, DLE и т. д. Хотя я сам когда-то делал сайт на DLE (чья бы корова мычала). Да, есть такой грешок. Но и винить людей я не могу. Это их дело на чем они будут создавать сайт.

Скажу честно, свой блог я хотел запилить на WordPress. Но, так как я не умею работать с WP и мне лень было изучать структуру и код этого движка, я решил выбрать Laravel и сделал все с нуля.

Итак! Поговорим о "самой дешевой капче в мире". Зайдя на этот сайт, я наткнулся на форму обратной связи. За все время сколько я сижу в интернете, я не видел настолько чмошной капчи, как на этом сайте. У меня нет сомнений, что-то разработчик, который создал эту капчу, имел на одну хромосому больше обычного человека.

Мне нравится проводить анализ чужого кода. Бывает, что можно найти интересные авторские решения (и стырить их). Раз уж я решил запустить еще одну рубрику на своем блоге "АнализКода", в качестве первой статьи, я расскажу про эту капчу. Начнем с плюсов этой капчи.

# Плюсы:

  • [+] Очень простая и легковесная капча
  • [+] Не требует серверного вмешательства
  • [+] Никаких сессий, GD и т.д.

# Минусы:

  • [-] Капча генерируется на клиентской части
  • [-] Капча генерируется не как изображение, а простое сочетание HTML элементов (мат. выражение)
  • [-] Легко подменить верный ответ и провести массовый спам.

Начнем с того, что можно провести атаку даже без ввода капчи. Серверу без разницы, прислали вы капчу или нет. Результат - "Благодарим за обращение!".

Первым делом проверим HTML код.

Как вы можете заметить, капча биндится через document.write(). Если приглядеться внимательней, то имеются две переменные a и b. Если мы можем их вставить через document.write(), это значит, что переменные доступны глобально.

Давайте попробуем вывести значения этих переменных в консоли.

То есть, мы можем получить или изменить эти значения. Пошарив исходный код, наткнулся на файл captcha.js в котором лежит код проверки капчи. Там же, есть главная переменная code с верным результатом.

# captcha.js

function trim(str) {
        var str = str.replace(/^\s+|\s+$/g,"");
        return str;
}
function ValidCaptcha(a,b){
        var a = trim(a);
        if (a == b){
                return true;   
        }
        return false;
}
function checkform(theform, b){
        var why = "";
        var a = theform.input.value;
        if(a == ""){
                why += "Security code should not be empty.\n";
        }
        if(a != ""){
                if(!ValidCaptcha(a, b)){
                        why += "Security code did not match.\n";
                }
        }
        if(why != ""){
                alert(why);
                return false;
        }
}
var a = Math.ceil(Math.random() * 9);
var b = Math.ceil(Math.random() * 9);
var code = a + b;

Генерируются 2 случайнах числа a и b. Эти два числа складываются и результат сохраняется в переменной code.

Функция trim() избавляется от лишних пробелов в начале и в конце строки. Наверное для того, чтобы пользователь не напихал лишних пробелов. Как все продуманно! Думаю нативный метод [String.trim()](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/Trim), который делает то же самое, автор не использовал из-за принципа. Молодец!

Функция ValidCaptcha() сверяет code с тем результатом, который ввел пользователь. Ну и checkform() проверяет, может ли форма отправиться или нет.

Подменив значение в code, форма успешно отправляется.

Это все круто! Однако, зачем я написал эту статью? Это никакой не разгром и реверс инженеринг. Статью писал исключительно в ознакомительных целях. Рассказать, что такая "защита" не имеет никакого смысла, если логика выполняется только на клиентской стороне.

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

И конечно, самый лучший вариант - reCaptcha от Google.