Simindey
6/1/2017 - 5:42 PM

Анти бот

Анти бот

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

    Заполняющие поля формы;
        Заполняющие все поля кроме "type=hidden";
        Заполняющие все поля включая "type=hidden" кроме скрытых в "display:none" или "visibility: hidden";
        Заполняющие поля с атрибутами типа NAME, EMAIL и т.д.
    Отправляющие данные прямо в "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-го типа.

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