Битрикс CAPTCHA – валидация форм и защита от спама
Когда ваш сайт засыпают спамом, на помощь приходит CAPTCHA. В данном примере вы увидите как в своих формах можно применять этот замечательный инструмент, который помогает бороться с ботами и хламом в почте или инфоблоках.
CAPTCHA в своих формах при помощи 1C-Битрикс
В формах у 1С-Битрикс капча присутствует, и включается в настройках компонента. Рассмотрим пример генерации CAPTCHA для своих веб-форм при помощи встроенных инструментов в данную CMS.
Для понимания разобьем весь процесс на 3 шага.
ШАГ I. Разбираем HTML код формы:
$cpt->SetCodeCrypt($captchaPass); ?>
В самом начале мы генерируем капчу, если всё сработало правильно, в вашей форме появится поле для ввода. Также, подключается класс для работы с капчей.
Как это выглядит:

ШАГ II. Теперь пишем js, который отвечает за отправку формы (jquery – ajax):
$('.js-form').on('submit', function()< var $this = $(this); $.ajax(< url: $this.attr('action'), type: 'post', cache: false, data: $this.serialize(), >).done(function(data) < if (data == 'error') < $this.find('.error-text').text('Вы не правильно заполнили поля!'); >else < //$this.html(''+data+'
'); parent.$.fancybox.close(); $.fancybox(< href: '#finish', closeBtn: true >); > console.log(data); >).error(function()< console.log('There was an error'); >); return false; >);
Какие в скрипте есть нюансы:
1. В action мы записываем ссылку на файл, который обрабатывает данные из формы и записывает их в админку Битрикса;
2. Выводим на месте ошибки что поля заполнены не верно в случае если это так – когда js переменная data = error;
3. При помощи плагина fancybox, мы сначала закрываем окно с нашей формой, а потом открываем окно с благодарностью, универсальное для всех форм.
Подключение jquery на сайте – обязательно.
ШАГ III. Страница для нашей формы – /ajax/writeUs.php :
CaptchaCheckCode($_POST["captcha_word"], $_POST["captcha_code"])) < echo 'error'; >else < CModule::IncludeModule("iblock"); $el = new CIBlockElement; $arLoadProductArray = Array( "MODIFIED_BY" =>$USER->GetID(), "IBLOCK_SECTION_ID" => false, "IBLOCK_ID" => 31, "NAME" => htmlspecialchars($_POST['fio']).' ('.htmlspecialchars($_POST['phone']).')', "PREVIEW_TEXT" => 'Контактное лицо: '.htmlspecialchars($_POST["fio"])."\r\n". 'Название организации: '.htmlspecialchars($_POST["name"])."\r\n". 'Телефон: '.htmlspecialchars($_POST["phone"])."\r\n". 'E-mail: '.htmlspecialchars($_POST["email"])."\r\n". 'Вопрос: '.htmlspecialchars($_POST["text"]), "ACTIVE" => "Y" ); $ELEMENT_ID = $el->Add($arLoadProductArray); $arEventFields = array( "EMAIL_FROM" => FORM_SENDER_EMAIL, "EMAIL_TO" => FORM_RECEIVE_EMAIL, "NAME" => htmlspecialchars($_POST["fio"]), "COMPANY_NAME" => htmlspecialchars($_POST["name"]), "PHONE" => htmlspecialchars($_POST["phone"]), "EMAIL" => htmlspecialchars($_POST["email"]), "QUESTION" => htmlspecialchars($_POST["text"]) ); CEvent::Send("SEND_FEEDBACK", "s1", $arEventFields); echo 'Спасибо! Форма отправлена.'; >
В самом начале мы проверяем – правильная ли у нас капча, если нет то передаем слово error и скриптом проверяем есть у нас ошибка или нет. Разбирать подробно как добавить поля в инфоблок, отправить почтовое сообщение в данной статье мы не будем (но самые любопытные смогут прочитать код и понять как это делается ).
Пара слов о блоке с формой:
Введите код с картинки*
GetCodeCrypt());?>" type="hidden">
Как вы видите, у нас есть скрытый инпут в который мы пишем значение капчи и тег с картинкой, в которую и передается CAPTCHA ID.
Как в битриксе обновить капчу без перезагрузки страницы
В нашей форме уже есть “защита от спама”. Очень нужная вещь, обновление картинки – на случай если плохо читается, или просто не видно.
Взглянем на наш код теперь:
Как видно из кода выше, мы добавили текстовую ссылку на смену картинки. Теперь напишем скрипт, который будет менять код для родительского блока captcha-block:
Чуть ниже код, который отвечает за генерацию капчи, а пока что давайте разберемся что тут происходит.
1. Мы пишем что скрипт срабатывает когда загружена все элементы страницы – документ рэди;
2. Регистрируем обработчик событий по клику на ссылку с классом reloadCaptcha в блоках с классом captcha-block ;
3. Записываем объект в переменную $parent, который и является нашим родительским блоком (у каждой формы он свой, а нам надо менять только внутри того, где мы кликнули);
4. Далее мы отправляем запрос на страницу, которая находится в корне сайта, в папке /ajax/ – имя страницы вы уже поняли ;
5. Полученный результат (data) – мы записываем и в переменную внутри тега img и в скрытый инпут, который в дальнейшем и проверяется при отправке формы.
Код для страницы /ajax/reload_captcha.php:
CaptchaGetCode()); ?>
Внимательный читатель догадался, показ и исчезновение блока .white-block находится в комментариях. Из кода я его убрал – в другой статье речь идет про обычный прелоадер во время выполнения запроса к серверу. Но на проекте был настолько быстрый отклик, что в прелоадере просто отпала вся необходимость, и капча генерировалась очень быстро.
Благодарю автора статьи за отличное решение, ссылка на оригинал:
https://dev.1c-bitrix.ru/community/webdev/user/61475/blog/2818/#like
Если на вашем сайте необходимо выполнить работы по защите от спама в веб-формах при помощи CAPTHCA, обращайтесь ко мне за помощью.
автор: Dmitriy
З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com
Читайте також:
Залишити відповідь Скасувати відповідь
Щоб відправити коментар вам необхідно авторизуватись.
Отключить captcha у формы авторизации/регистрации
1. Судя по тому, что написано здесь: https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=35&LESSON_ID=2128#captcha_mod у меня вообще нет настройки в главном модуле «Использовать Captcha при регистрации». В чем прикол, устаревшая документация? У меня Управление сайтом 15.5.10.
2. В настройках групп пользователей на вкладке «Безопасность», напротив надписи «Количество попыток ввода пароля до показа CAPTCHA:» установлена галка «Не переопределять».
3. Компонент «Форма авторизации» не содержит в себе настроек включения/отключения капчи. Почему? Не логично ли было бы ее туда поместить, чтобы не тратить несколько часов в поисках ответа?
4. В шаблоне компонента авторизации есть кусок кода, выводящий капчу
Удаляю его полностью. Но это ни к чему не приводит.
Куда еще смотреть?
Постоянный посетитель
Сообщений: 187 Баллов: 14 Регистрация: 10.07.2010
30.11.2015 17:11:58
| Цитата |
|---|
| Алексей Романов написал: у меня вообще нет настройки в главном модуле «Использовать Captcha при регистрации» |
Опция присутствует во всех редакциях во вкладке «Авторизация». Собственно отключение этой опции отключит капчу при регистрации.
Пункт 2 отключит капчу при авторизации
По пункту 3 — настройки берутся из опции пункт 2
4. Удаление кода приведет лишь к убиранию капчи из шаблона, но проверка на корректность капчи будет происходить все равно, если не отключена опция из п.2
Заглянувший
Сообщений: 21 Баллов: 1 Регистрация: 31.08.2015
30.11.2015 17:23:49
| Цитата |
|---|
| Сергей Ларин написал: Опция присутствует во всех редакциях во вкладке «Авторизация» |
Упс, прошу прощения за невнимательность. Действительно, во вкладке авторизация там это есть. Но искал ведь, видать плохо.
Предполагаю, что мне надо выспаться.
Человеческое спасибо, если бы не вы — продолжал бы копать совсем в другом направлении.
Страницы: 1
Продукты
Управление сайтом
Битрикс24
Интернет-магазин + CRM
Решения
Для интернет-магазинов
Каталог готовых решений
Внедрение
Выбрать партнера
Проверить партнера
Стать партнером
1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности
1С-Битрикс. Защита от спама в регистрации без капчи
Не редкость, когда боты начинают регистрироваться на сайтах и захламлять списки пользователей своим присутствием. В «1С-Битрикс» можно включить капчу для защиты от спама. Но порой и капча не спасает, да и заставлять пользователей вводить код с капчи, я считаю, не гуманно. Воспользуемся другим трюком.
Этот трюк давно известен: в форму добавляется скрытое или невидимое поле. Если это поле заполнено, значит бот, если нет, значит обычный пользователь.
Разберем на основе регистрации
Скопируем шаблон системного компонента bitrix:system.auth.registration.
В файле template.php этого шаблона добавим новое поле, примерно так:
tr class="urdn"> td>GetMessage("AUTH_FAKE_NAME")?>td> td>input type="text" name=" " maxlength="50" value=" $arResult[OlegPro\UserRegister::FAKE_FIELD_NAME1] ?>" class="bx-auth-input" />td> tr>
В файле стилей шаблона надо прописать правила, чтобы скрыть это поле.
.urdn, .urdn td display: none; >
В файл result_modifier.php добавим обработку нашего фейкового поля:
use OlegPro\UserRegister; $arResult[UserRegister::FAKE_FIELD_NAME1] = isset($_POST[UserRegister::FAKE_FIELD_NAME1]) ? htmlspecialcharsbx($_POST[UserRegister::FAKE_FIELD_NAME1]) : '';
В файл lang/язык_сайта/template.php в папке скопированного шаблона добавим название фейкового поля:
$MESS['AUTH_FAKE_NAME'] = "Имя пользователя:";
В файл /bitrix/php_interface/handlers/user_register.php добавим хэндлер-детектор ботов. Он будет срабатывать на событие OnBeforeUserRegister модуля main. Если наше фейковое поле заполнено, то выбросим битриксовкий эксепшн и добавим сообщение об ошибке.
namespace OlegPro; class UserRegister /** * Ключ фейкового поля */ const FAKE_FIELD_NAME1 = 'NAME'; /** * Вызывается до попытки регистрации нового пользователя методом CUser::Register. * Проверка на бота. * @param &$arFields Массив полей регистрации нового пользователя * @return bool */ public static function OnBeforeUserRegister(&$arFields) global $APPLICATION; if(isset($_REQUEST[self::FAKE_FIELD_NAME1]) && strlen(trim($_REQUEST[self::FAKE_FIELD_NAME1])) > 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; > >
В /bitrix/php_interface/init.php добавим автозагрузку нашего обработчика и навесим обработчик:
/** * Лечение для регистрации без капчи */ \Bitrix\Main\EventManager::getInstance()->AddEventHandler('main', 'OnBeforeUserRegister', array('OlegPro\UserRegister', 'OnBeforeUserRegister')); CModule::AddAutoloadClasses( '', array( 'OlegPro\UserRegister' => '/bitrix/php_interface/handlers/user_register.php', ) );
Результат

Теперь в журнале событий вот такая картина:
P.S.
Кстати, этот способ работает и у меня в блоге, в форме добавления комментария к посту.
2 июля 2014 в 10:25
Олег Максименко
Похожие записи
1С-Битрикс. LazyLoad или ленивая загрузка контента при включенном кешировании
В этой заметке я хочу рассказать о технологии LazyLoad или в простонародье «ленивая загрузка» в Битриксе. Метод, описанный мной, будет точно работать в компонентах catalog.section и news.list.
1C-Битрикс. Кастомизация нового шаблона компонента sale.order.ajax
С выходом нового шаблона компонента sale.order.ajax на форумах битрикса разгораются возмущения и недомения. Мол, теперь код всего шаблона на JavaScript и как его кастомизировать непонятно. На самом деле да, код js-скрипта составляет почти семь тысяч строк. Сходу в таком количестве кода, даже хорошо написанного (к сожалению, битрикс этим не балует), соблюдая паттерны программирования, будет непросто.
В этой заметке я покажу способ, как можно кастомизировать основной скрипт логики шаблона оформления заказа (order_ajax.js), не прибегая к его правке. Что нам это даёт? Когда прилетят очередные обновления шаблона, мы просто заменим его и всё. Все наши кастомизации будут работать (в теории).
1С-Битрикс. Пишем человеческий шаблон многоуровнего меню каталога
Не буду писать про боль при интегации дефотного шаблона. Давайте просто напишем свой, с блекджеком и вот этим всем.
В заметке будет (интересного):
- построение древовидного массива без рекурсии (неограниченной вложенности)
- анонимная рекурсивная функция
- формирование урлов для секций супер-быстрым способом
- поработаем с сущностями инфоблока через ORM D7
Использование капчи в Bitrix
В некоторых случаях, как правило, при использовании html-форм на сайте требуется сделать капчу, делается это для защиты от циклической отправки формы, от спам-ботов, и не только. Вообще сделать капчу несложно, но так как в стандартном функционале битрикса есть встроенный механизм капчи, то это дело упрощается вдвойне. Нам же остается воспользоваться этим функционалом, давайте посмотрим, как можно прикрутить капчу к форме.
Перед тем как размещать поля капчи на форме, нам необходимо инициализировать генерацию кода для проверки.
Генерируем код капчи:
// подключаем файл модуля капчи include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php"); // создаем объект капчи $cpt = new CCaptcha(); // достаем значение параметра captcha_password из главного модуля $captchaPass = COption::GetOptionString("main", "captcha_password", ""); // если строка пуста, генерируем случайное значение If (strlen($captchaPass) $cpt->SetCodeCrypt($captchaPass);
Обратите внимание на первую строчку в коде, где подключается файл модуля капчи – captcha.php. Если ранее уже подключался пролог, то подключать данный файл не нужно.
Размещаем поля на форме. Поля должны находиться строго после кода указанного выше, т.к. используется переменная с объектом класса CCaptcha, инициализированная ранее.
GetCodeCrypt());?>» type=»hidden»>
Проверяем капчу. В обработчике формы для проверки правильности ввода значения капчи можно использовать код:
if($APPLICATION->CaptchaCheckCode($_POST[«captcha_word»], $_POST[«captcha_code»])) < echo 'Всё верно!'; >else
На этом вроде всё. Капча может быть использована в любой части сайта, важным условием является предварительное включение файла модуля. В системе битрикс модули подгружаются автоматически при подключении пролога в исполняемом скрипте. Существует возможность использования модулей битрикса без подключения пролога, практикуется зачастую для обработки ajax-запросов, и не только, где нет необходимости в подгрузке шаблона сайта, и его составляющих.
Опубликован: 09.11.2014 г.
VK FB TW Whatsapp Telegram Email
