Защита от ботов в Битрикс
от v2Team
Одна из наиболее распространенных проблем для многих сайтов - это массовая регистрация и заполнения обратных форм ботами. Сегодня мы решим эту проблему для сайта на CMS Битрикс
Первым делом идем в init.php и прописываем следующий код
AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler");
function OnBeforeUserRegisterHandler(&$arFields)
{ global $APPLICATION; if(isset($_REQUEST['PROHODANET']) && is_array($_REQUEST['PROHODANET'])) { foreach($_REQUEST['PROHODANET'] as $k=>$v) if(empty($v)) unset($_REQUEST['PROHODANET'][$k]); } if($_REQUEST['PROHODANET'] || !isset($_REQUEST['PROHODANET'])) { $APPLICATION->ThrowException('Бот не пройдет'); return false; }
}
В шаблоне формы регистрации нам необходимо добавить дополнительное input поле
<input type="text" value="" name="PROHODANET">
Так как боты пытаются заполнить все поля, то и наше новое поле не станет исключением, наш обработчик будет отслеживать это действие и блокировать всех кто заполнит это поле
Теперь перейдем к защите наших форм обратной связи. Снова идем в init.php и вставляем туда следующий код.
AddEventHandler('form', 'onBeforeResultAdd', 'link_onBeforeResultAdd');
function link_onBeforeResultAdd($WEB_FORM_ID, &$arFields, &$arrVALUES)
{ global $APPLICATION; $spam = false; foreach($arrVALUES as $prop => $val) { if (strstr($prop, 'form_') && strstr($val, 'http')) { $spam = true; break; } } if ($spam == true) { $err_str = 'Запрещено указывать ссылки в полях формы!'; $APPLICATION->ThrowException($err_str); return false; }
}
Как правило боты пытаются через форму обратной связи отправить ссылку. Данная функция будет проверять наличие ссылки в форме обратной связи и блокировать отправку таких сообщений.
Второй способ это также добавить скрытое поле, в вебформу
AddEventHandler('form', 'onBeforeResultAdd', 'form_onBeforeResultAdd');
function form_onBeforeResultAdd($WEB_FORM_ID, &$arFields, &$arrVALUES)
{ global $APPLICATION; if(isset($_REQUEST['PROHODANET']) && is_array($_REQUEST['PROHODANET'])) { foreach($_REQUEST['PROHODANET'] as $k=>$v) if(empty($v)) unset($_REQUEST['PROHODANET'][$k]); } if($_REQUEST['PROHODANET'] || !isset($_REQUEST['PROHODANET'])) { $APPLICATION->ThrowException('Ботам отправка запрещена.'); return false; }
}
- 60 минут
Поработаем?
Опишите свой запрос, мы расчитаем стоимость вашей задачи.