Анти бот
Анализировал и проверял я ботов месяца 3-4, даже exit() прописывал в компоненте на отправку формы и не помогало, регистрации продолжались.
Вот как такое может быть? А оказывается, сама регистрация производится ядром продукта, независимо от компонента регистрации, хоть что в нем пиши, хоть удаляй весь код, все равно бот зарегистрируется.
Итак, после долгого анализа я понял, что есть всего два типа регистрационных ботов:
Заполняющие поля формы;
Заполняющие все поля кроме "type=hidden";
Заполняющие все поля включая "type=hidden" кроме скрытых в "display:none" или "visibility: hidden";
Заполняющие поля с атрибутами типа NAME, EMAIL и т.д.
Отправляющие данные прямо в "action" формы, мимо полей.
Что получается, изначально, когда я знал только про первый тип ботов как в 1 случае, я везде в формах делал инпут:
1. С непустым атрибутом "name":
<input type="text" class="api-mf-antibot" value="" name="ANTIBOT[NAME]">
2. И применял к нему следующие стили, где инпут с размером шрифта 0 и абсолютным позиционированием, чтобы был виден только роботу:
.api-mf-antibot{
border: 0 none !important;
font-size: 0 !important;
height: 0 !important;
line-height: 0 !important;
padding: 0 !important;
position: absolute !important;
right: 0 !important;
top: 0 !important;
width: 0 !important;
}
Но этого оказалось недостаточно, т.к. присутствовал второй тип ботов, которые не заполняют никакие поля, сразу в action формы фигачат, но и тут есть решение из коробки Битрикс в виде события перед регистрацией.
3. Этот код проверит существование скрытого инпута и наличе в нем какого-то текста, если не существует в $_REQUEST или что-то там написано, код отменяет регистрацию.
//Антибот регистрации на сайте
AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler");
function OnBeforeUserRegisterHandler(&$arFields)
{
global $APPLICATION;
//В файл 1_txt.php будут записываться вск регистрации, можете закомментировать эти три строки
$_REQUEST['DATE'] = date('d-m-Y H:i:s');
$tttfile=dirname(__FILE__).'/1_txt.php';
file_put_contents($tttfile, "<pre>".print_r($_REQUEST,1)."</pre>\n",FILE_APPEND);
//CSS ANTIBOT
if(isset($_REQUEST['ANTIBOT']) && is_array($_REQUEST['ANTIBOT']))
{
foreach($_REQUEST['ANTIBOT'] as $k=>$v)
if(empty($v))
unset($_REQUEST['ANTIBOT'][$k]);
}
if($_REQUEST['ANTIBOT'] || !isset($_REQUEST['ANTIBOT']))
{
$APPLICATION->ThrowException('Ошибка регистрации.');
return false;
}
//\\CSS ANTIBOT
}
Код выше необходимо добавить в файле:
/bitrix/php_interface/init.php
Итак, прозрачный невидимый человеку инпут избавляет нас от роботов 1-го типа, а php-код в событии избавит наc от ботов 2-го типа.
Все, этого будет достаточно для защиты сайта от автоматических регистраций.