1С-Битрикс. Защита от спама в регистрации без капчи
Не редкость, когда боты начинают регистрироваться на сайтах и захламлять списки пользователей своим присутствием. В «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 добавим обработку нашего фейкового поля:
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. Если наше фейковое поле заполнено, то выбросим битриксовкий эксепшн и добавим сообщение об ошибке.
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.
Кстати, этот способ работает и у меня в блоге, в форме добавления комментария к посту.
10 комментариев
Здравствуйте! Подскажите где найти этот файл result_modifier.php
Если его нет, то его нужно создать в папке шаблона компонента регистрации.
Спасибо, хорошее решение. Вопрос. Я хочу такую штуку реализовать на стадии оформления заказа в интернет-магазине. Подскажите где копаться?
По тому же принципу, только на события оформления заказа компонента sale.order.ajax
Супер! До установки этого решения боты регистрировали до двадцати пользователей в день. Каптча не спасала. Теперь порядок. Спасибо!!!
Добрый день! Подскажите а для формы обратной связи в какие файлы код добавлять?
Отвечал в комментарии к другой заметке про кастомный валидатор поля веб-формы
Легко обойти, если бот будет проверять инпут на :visible
Можно не скрывать, а просто покрасить инпут в цвет фона.
style="position: absolute; left: -9999px; display: none;" - это в место стилей
Все еще актуально в 2019