Антибот регистрации на сайте Битрикс

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

Регистрации в Битрикс

Анализировал и проверял я ботов месяца 3-4, даже exit() прописывал в компоненте на отправку формы и не помогало, регистрации продолжались.
Вот как такое может быть? А оказывается, сама регистрация производится ядром продукта, независимо от компонента регистрации, хоть что в нем пиши, хоть удаляй весь код, все равно бот зарегистрируется.

Итак, после долгого анализа я понял, что  есть всего два типа регистрационных ботов:
  1. Заполняющие поля формы;
    1. Заполняющие все поля кроме "type=hidden";
    2. Заполняющие все поля включая "type=hidden" кроме скрытых в "display:none" или "visibility: hidden";
    3. Заполняющие поля с атрибутами типа NAME, EMAIL и т.д.
  2. Отправляющие данные прямо в "action" формы, мимо полей.

Что  получается, изначально, когда я знал только про первый тип ботов как в 1 случае, я везде в формах делал инпут:

1. С непустым атрибутом "name":
<input type="text" class="api-mf-antibot" value="" name="ANTIBOT[NAME]">

2. И применял к нему следующие стили, где  инпут с размером шрифта 0 и абсолютным позиционированием, чтобы был виден только роботу:
.api-mf-antibot{
    border: 0 none !important;
    font-size: 0 !important;
    height: 0 !important;
    line-height: 0 !important;
    padding: 0 !important;
    position: absolute !important;
    right: 0 !important;
    top: 0 !important;
    width: 0 !important;
}

Но этого оказалось недостаточно, т.к. присутствовал второй тип ботов, которые не заполняют никакие поля, сразу в action формы фигачат, но и тут есть решение из коробки Битрикс в виде события перед регистрацией.
3. Этот код проверит существование скрытого инпута и наличе в нем какого-то текста, если не существует в $_REQUEST или что-то там написано, код отменяет регистрацию.
//Антибот регистрации на сайте
AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler");
function OnBeforeUserRegisterHandler(&$arFields)
{
    global $APPLICATION;
   
    //В файл 1_txt.php будут записываться вск регистрации, можете закомментировать эти три строки
    $_REQUEST['DATE'] = date('d-m-Y H:i:s');
    $tttfile=dirname(__FILE__).'/1_txt.php';
    file_put_contents($tttfile, "<pre>".print_r($_REQUEST,1)."</pre>\n",FILE_APPEND);

    //CSS ANTIBOT
    if(isset($_REQUEST['ANTIBOT']) && is_array($_REQUEST['ANTIBOT']))
    {
        foreach($_REQUEST['ANTIBOT'] as $k=>$v)
            if(empty($v))
                unset($_REQUEST['ANTIBOT'][$k]);
    }

    if($_REQUEST['ANTIBOT'] || !isset($_REQUEST['ANTIBOT']))
    {
        $APPLICATION->ThrowException('Ошибка регистрации.');
        return false;
    }
    //\\CSS ANTIBOT
}

Код выше необходимо добавить в файле:
/bitrix/php_interface/init.php


Итак, прозрачный невидимый человеку инпут  избавляет нас от роботов 1-го типа, а php-код в событии избавит наc от ботов 2-го типа.

Все, этого будет достаточно для защиты сайта от автоматических регистраций.

Инструкция по защите сайта от автоматических регистраций

Итак, чтобы защитить сайт от автоматической регистраций в Битрикс нужно:
  1. Скопировать шаблон компонента регистрации;
  2. Добавить в нем скрытый для робота инпут;
  3. Применить к скрытому инпуту стили где-нибудь в стилях в шаблоне сайта или в самом компоненте регистрации в файле style.css;
  4. Добавить php-код  с событием перед регистрацией в файл init.php.

Заключение

Этот способ проверен мной годами, он подойдет вообще к любой форме на сайте и на любом сайте, но если это не сайт на Битрикс, то надо будет следующий php-код  найти где вписать в обработчике формы, когда прилетел массив $_REQUEST:

if(isset($_REQUEST['ANTIBOT']) && is_array($_REQUEST['ANTIBOT']))
{
    foreach($_REQUEST['ANTIBOT'] as $k=>$v)
        if(empty($v))
            unset($_REQUEST['ANTIBOT'][$k]);
}

if($_REQUEST['ANTIBOT'] || !isset($_REQUEST['ANTIBOT']))
    return;

А в атрибут value="" добавить php-код, который будет помнить заполненное ботом значение, т.е. хоть раз там что-то ввел, все, попался на каждом сабмите.
<input type="text" name="ANTIBOT[NAME]" value="<?=$_REQUEST['ANTIBOT']['NAME'];?>" class="api-mf-antibot">
p.s. сам я на php-форме не проверял, если что, попробуйте наоборот оставить в инпуте атрибут  value="" пустым без php-кода.


Данный способ защит от ботов встроен в моем модуле и рекомендуется вместо капчи:
Форма обратной связи + конструктор форм

Еще хочу отметить, что после того, как я сделал регистрацию на сайте в модальных окнах по этой статье, также не проходят автоматические регистрации, видно из-за того, что форма регистрации появляется кликом по ссылке в форме авторизации, даже скрытого инпута нет.
Аякс форма авторизации и регистрации Битрикс на jQuery Ajax

Обновлено: 02.04.2015 21:00:00
Установка модуля