Magento. Защита формы регистрации от ботов

Magento. Защита формы регистрации от ботов

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

Случай описанный в этой статье относится к магазинам, которые работают на платформе Magento, но, скорее всего эта уязвимость может быть использована для любого сайта, который использует веб формы.

Регистрация пользователей на сайте с целью отправки мейл сообщения рекламного характера или с целью установки вредоносного ПО

Когда вы регистрируетесь на сайте, то вам обычно предлагают ввести мейл, на который придет сообщение с подтверждением вашего аккаунта. Практически в любом интернет магазине есть страница на которой можно ввести данные, обычно это имя, мейл, пароль, далее нужно нажать кнопку на форме и зарегистрироваться на этом сайте. После чего происходит не менее обычные действия – приходит письмо в котором вас просят подтвердить ваши намерения стать пользователем этого сайта – действительно ли это были вы или кто то другой использовал ваш мейл. В теле и теме письма обычно содержится обращение к вам, ибо вы заполнили поле имя и то, что вы туда ввели будет отображаться в письме. В принципе никто не запрещает вам ввести в это поле, что то другое, например какой то рекламный лозунг или ссылку на другой сайт. Так же в поле мейл вы можете ввести мейл кого угодно и это письмо скорее всего придет на тот адрес, который будет указан. Исходя из перечисленного, можно предположить, что сайт возможно использовать, как сервис для доставки писем. Соглашусь с тем, что письмо все таки будет иметь фирменный стиль сайта, с которого оно придет и скорее всего оно будет не очень информативным, но, случаи бывают разные и есть шаблоны которые можно использовать для таких целей. По этому стоит избегать включения имен пользователей в тему письма ибо это можно использовать, как лазейку. Далее злоумышленник может использовать форму регистрации для отправки писем по своей базе мейлов, которых может быть десятки, а то и сотни тысяч. В поле имя добавляется текст, который будет фигурировать в теме письма и этого будет достаточно, что бы даже не открывая его, уже получить “заряд” информации. Поскольку письмо было отправлено с доверенного и проверенного отправителя – сервера, то скорее всего оно не попадет в спам.

Большинство интерфейсов почтовых программ или сервисов, спроектированы так, что вы не открывая, загружая письма, сможете узнать его содержимое, уже по заголовку, т.е. вас даже не спросили, хотели вы это читать или нет, но вы 100% прочитаете.

 

Какие меры необходимо предпринять, что бы не стать жертвой

Что бы понять, как себя защитить, нужно знать как нападать. Большинство веб-сайтов работают на одинаковых или наиболее популярных CMS. Узнать на какой CMS работает ваш сайт в большинстве случаев не составит труда.  Для эффективного использования вашего сайта, в качестве транслятора сообщений потребуется предварительно изучить работу конкретной CMS, что бы при сканировании вашего сайта использовать нужный скрипт для поиска и использования уязвимостей.

Наиболее уязвимы на сайте это формы, ибо они содержат открытый урл – адрес, куда форма будет отправлять данные, а так же у формы есть набор полей – данных, которые будут отправлены и скорее всего эти поля не будет изменяться. Так же формы могут содержать секретный ключ в одном из скрытых полей. В Magento это поле называется form_key

<input name="form_key" type="hidden" value="xdQOSZ7M7RY5WUIO" />

Это поле защищает ваш сайт только от прямой отправки данных в адрес формы. Другими словами, вы или кто то другой, должны отправить форму только с сайта. Но в нашем случае, бот загружает страницу сайта и отправляет форму, в которой ключ уже есть, практически полностью имитируя браузер.

Защита формы.

Базовая защита у формы уже есть – это ключ form_key, но он, как нам уже известно защищает нас только от “прямой” отправки данных в урл. Все что потребуется программе – боту, это просто загрузить страницу с уже сгенерированным ключем.

Далее мы убираем из формы урл – адрес куда форма должна быть отправлена.

Было

<form id="register_form" action="https://domain.com/customer/account/createpost/" method='POST'>
</form>

Стало

<form id="17c7bdae144827beb4e91de1da8b87c48b2cff36">
</form>

Что сделали. Убрали УРЛ, метод и другие атрибуты типа метод доставки POST/GET. ИД формы заменен с постоянного читабельного на не постоянный.

При каждом обновлении страницы ИД формы будет обновляться, что будет вносить определенные сложности для бота, который будет сканировать страницу и тот не сможет “зацепиться” за идентификатор и следовательно не сможет сформировать правило для атаки или использования элементов страницы в своих целях.

 

На картинке можно наблюдать как изменяется идентификатор при обновлении страницы.

Урл убрали, идентификатор сделали не постоянным, в принципе ИД тоже можно убрать.

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

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

var dataForm = new VarienForm('471447a1046e571d5dd40350681e9092ddd1440a', true);

$('471447a1046e571d5dd40350681e9092ddd1440a').onsubmit = function(event) {
    if (!dataForm.validator.validate()){
        event.preventDefault();
        return false;
    } else {
        this.setAttribute('action', window.atob('aHR0cHM6Ly9iYWJ5bW9kYS51YS9jdXN0b21lci9hY2NvdW50L2NyZWF0ZVBvc3Qvay81NWJjYzA2NjY5MWJlYzA1OTExYzg2NzQ5YzY2YWFkOC8='));
    }
}

 

Содержимое скрипта также меняется при каждой перезагрузке страницы

 

Что делает скрипт

Переписывает событие submit формы, для того что бы произвести ее валидацию и если данные введены корректно, то в атрибут action формы записывается УРЛ, на который будут отправлены данные формы и который будет содержать секретный ключ, который в свою очередь действует только для текущей сессии и этот ключ изменится если обновить страницу (это видно на картинках выше). На каждое посещение страницы, генерируется уникальный ключ, который хранится в текущей сессии пользователя и который мы будем проверять, когда получим данные.

УРЛ на который будут отправлены данные, закодирован с использованием base64, для того, что бы скрыть информацию об адресах на странице.

Что происходит на сервере

Из данных которые отправил пользователь извлекается ключ и сравнивается с тем, что есть в сессии. Если ключи равны, есть большая вероятность, что форму отправил человек.

Что можно сделать для обеспечения дополнительной безопасности

  • Закодировать Javascript, что бы сделать его не читабельным. В сети есть бесплатные сервисы по запросу Javascript Obfuscator
  • Изменить урл для страницы регистрации, что бы исключить случайные заходы и проверки, а так же совпадения по которым можно будет определить, какую CMS вы используете
  • Изменить стандартные – системные: урл и имя функции которая будет принимать данные от формы, поскольку вы можете поменять адрес страницы регистрации, но адрес приема данных останется тот же. По этому имеет смысл менять оба адреса, иначе смысла от этих действий не будет.
  • Сделать функцию приема данных динамической, имя которой будет генерироваться случайным образом.

Что необходимо делать для обеспечения безопасности интернет-магазина/сайта

  • Проверять и устанавливать обновления/патчи безопасности для вашей платформы
  • Мониторить состояние – изменения кода проекта, через систему контроля версий
  • Использовать сервисы для отслеживания ошибок на страницах сайта типа – https://www.kuoll.com
  • Проект должен работать под учетной записью c ограниченными правами. Учетную запись нужно ограничить в ресурсах: количество одновременно открытых дескрипторов, потоков, использование процессора, ОЗУ и так далее
  • Периодическая проверка ПО сервера, обновление и установка необходимых патчей
  • Резервное копирование