Одна из наиболее распространенных проблем для многих сайтов - это массовая регистрация и заполнения обратных форм ботами. Сегодня мы решим эту проблему для сайта на 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;
    }
}
Готовы сделать всю работу за Вас
от750
  • 60 минут


Поработаем?

Опишите свой запрос, мы расчитаем стоимость вашей задачи.