Защита от ботов в Битрикс
от 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;
}
}
Поработаем?
Опишите свой запрос, мы расчитаем стоимость вашей задачи.