Не редкость, когда боты начинают регистрироваться на сайтах и захламлять списки пользователей своим присутствием. В «1С-Битрикс» можно включить капчу для защиты от спама. Но порой и капча не спасает, да и заставлять пользователей вводить код с капчи, я считаю, не гуманно. Воспользуемся другим трюком.

Этот трюк давно известен: в форму добавляется скрытое или невидимое поле. Если это поле заполнено, значит бот, если нет, значит обычный пользователь.

Разберем на основе регистрации

Скопируем шаблон системного компонента bitrix:system.auth.registration.

В файле template.php этого шаблона добавим новое поле, примерно так:

<tr class="urdn">
    <td><?=GetMessage("AUTH_FAKE_NAME")?></td>
    <td><input type="text" 
               name="<?php echo OlegPro\UserRegister::FAKE_FIELD_NAME1 ?>" 
               maxlength="50" 
               value="<?php echo $arResult[OlegPro\UserRegister::FAKE_FIELD_NAME1] ?>" 
        class="bx-auth-input" /></td>
</tr>

В файле стилей шаблона надо прописать правила, чтобы скрыть это поле.

.urdn, .urdn td {
    display: none;
}

В файл result_modifier.php добавим обработку нашего фейкового поля:

<?php
 
use OlegPro\UserRegister;
 
$arResult[UserRegister::FAKE_FIELD_NAME1] = isset($_POST[UserRegister::FAKE_FIELD_NAME1]) 
    ? htmlspecialcharsbx($_POST[UserRegister::FAKE_FIELD_NAME1]) 
    : '';

В файл lang/язык_сайта/template.php в папке скопированного шаблона добавим название фейкового поля:

$MESS['AUTH_FAKE_NAME'] = "Имя пользователя:";

В файл /bitrix/php_interface/handlers/user_register.php добавим хэндлер-детектор ботов. Он будет срабатывать на событие OnBeforeUserRegister модуля main. Если наше фейковое поле заполнено, то выбросим битриксовкий эксепшн и добавим сообщение об ошибке.

<?php
 
namespace OlegPro;
 
class UserRegister{
 
    /**
     * Ключ фейкового поля
     */
    const FAKE_FIELD_NAME1 = 'NAME';
 
    /**
     * Вызывается до попытки регистрации нового пользователя методом CUser::Register.
     * Проверка на бота.
     * @param &$arFields Массив полей регистрации нового пользователя
     * @return bool
     */
    public static function OnBeforeUserRegister(&$arFields){
        global $APPLICATION;
 
        if(isset($_REQUEST[self::FAKE_FIELD_NAME1]) 
            && strlen(trim($_REQUEST[self::FAKE_FIELD_NAME1])) > 0){
 
           // для полноты картины запишем все заполненные ботом поля в системный журнал
            \CEventLog::Add(array(
                "SEVERITY" => "SECURITY",
                "AUDIT_TYPE_ID" => "USER_REGISTER_FAIL",
                "MODULE_ID" => "main",
                "ITEM_ID" => "UNKNOWN",
                "DESCRIPTION" => sprintf("Попытка регистрации ботом. Код ошибки [FK1].\n%s", 
                    var_export($_REQUEST, true)),
            ));
 
            $APPLICATION->ThrowException('Ошибка регистрации. Код ошибки [FK1].');
            return false;
        }
        return true;
 
    }
 
}

В /bitrix/php_interface/init.php добавим автозагрузку нашего обработчика и навесим обработчик:

/**
 * Лечение для регистрации без капчи
 */
\Bitrix\Main\EventManager::getInstance()->AddEventHandler('main', 'OnBeforeUserRegister', 
    array('OlegPro\UserRegister', 'OnBeforeUserRegister'));
 
CModule::AddAutoloadClasses(
    '',
    array(
        'OlegPro\UserRegister' => '/bitrix/php_interface/handlers/user_register.php',
    )
);


Результат

Теперь в журнале событий вот такая картина:


P.S.
Кстати, этот способ работает и у меня в блоге, в форме добавления комментария к посту.