Защита формы от спама без captcha в Битрикс и не только
Последние записи
Рано или поздно на всех сайтах возникает необходимость защитить формы обратной связи или регистрации\авторизации от спам-ботов. Captcha с защитой не справляется, да и не удобна для пользователя. Но есть пути защиты через скрытые поля в формах. Данный метод достаточно эффективен против большинства ботов, поскольку требует ручного анализа формы и траты личного времени спамера, на что идут очень немногие и в редких случаях.
Первым делом скопируем весь компонент в свое пространство имен (для внесения изменений в базовый класс), переназовем шаблон .default
нужным нам именем и все изменения будем производить в нем.
Т.е. копируем, например, папку /bitrix/components/bitrix/system.auth.registration
в /local/components/tichiy/system.auth.registration
и работаем в ней
Затем в код формы шаблона добавим обычный инпут со случайным осмысленным именем
<div class='newTR'><input type="text" name="EMAIL" maxlength="50" placeholder="Введите ваш email" value="" /> </div>
В css прописываем стили скрывающие данное поле от добронамеренных пользователей
.newTR{display:none}
Если нет, то добавляем файл result_modifier.php
и в самый конец дописываем
$arResult['EMAIL'] = isset($_POST['EMAIL']) ? htmlspecialcharsbx($_POST['EMAIL']) : '';
В файле /local/php_interface/handlers/user_register.php
добавим хэндлер-детектор ботов. Он будет срабатывать на событие OnBeforeUserRegister
модуля main. Если наше фейковое поле заполнено, то выбросим битриксовкий exception
и добавим сообщение об ошибке.
namespace Tichiy;
class UserRegister{
/**
* Вызывается до попытки регистрации нового пользователя методом CUser::Register.
* Проверка на бота.
* @param &$arFields Массив полей регистрации нового пользователя
* @return bool
*/
public static function OnBeforeUserRegister(&$arFields){
global $APPLICATION;
if(isset($_REQUEST['EMAIL'])
&& strlen(trim($_REQUEST['EMAIL'])) > 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;
}
}
В /local/php_interface/init.php
добавим автозагрузку нашего обработчика и навесим обработчик:
/**
* Лечение для регистрации без капчи
*/
\Bitrix\Main\EventManager::getInstance()->AddEventHandler('main', 'OnBeforeUserRegister', array('Tichiy\UserRegister', 'OnBeforeUserRegister'));
CModule::AddAutoloadClasses('', array('Tichiy\UserRegister' => '/bitrix/php_interface/handlers/user_register.php',));
Адаптация материала:
Комментарии