1С-Битрикс

Подключение Google reCAPTCHA v3 к веб‑формам Битрикс через init.php

Пошаговая инструкция по подключению Google reCAPTCHA v3 к веб-формам в 1С-Битрикс через файл init.php. Защита от ботов без лишних действий для пользователя

sqlka.ruОпубликовано: Чтение: 4 мин.
Подключение Google reCAPTCHA v3 к веб‑формам Битрикс через init.php

Google reCAPTCHA v3 — это современный способ защиты сайта от автоматических отправок (ботов), который не требует от пользователя вводить коды или отмечать картинки. Вместо этого анализируется поведение посетителя и присваивается «оценка» (score) от 0.0 (бот) до 1.0 (человек). В этой статье мы рассмотрим, как встроить reCAPTCHA v3 в стандартные веб‑формы 1С‑Битрикс с помощью файла init.php.

Преимущества reCAPTCHA v3

  • Невидима для пользователя — не требует кликов и ввода текста.
  • Адаптивна — анализирует реальные действия на странице.
  • Позволяет задать порог срабатывания (например, отсекать запросы с оценкой ниже 0.5).

Шаг 1. Получение ключей reCAPTCHA v3

  1. Перейдите на страницу администрирования reCAPTCHA.
  2. Зарегистрируйте новый сайт, выберите тип reCAPTCHA v3.
  3. Укажите домены, на которых будет использоваться капча.
  4. После создания вы получите два ключа: Site key (публичный ключ) и Secret key (для серверной проверки).

Вместо проверки REQUEST_URI можно использовать другие условия, например наличие определённого компонента или ID формы.

Шаг 2. Добавление скрытого поля с токеном в форму

Для отправки токена reCAPTCHA на сервер необходимо добавить скрытое поле в каждую веб‑форму. Это можно сделать через настройки формы в административной панели (создать поле типа «Скрытое» с именем g-recaptcha-response) или прямо в шаблоне формы.

Проще всего добавить код инициализации reCAPTCHA в конец страницы, который будет заполнять скрытое поле перед отправкой. Расширим наш обработчик в init.php:

<?php
AddEventHandler('main', 'OnEndBufferContent', 'addReCaptchaScript');

function addReCaptchaScript(&$content) {
    if (strpos($_SERVER['REQUEST_URI'], '/web/form/') !== false) {
        $siteKey = 'ВАШ_SITE_KEY';
        $script = '
        <script src="https://www.google.com/recaptcha/api.js?render=' . $siteKey . '"></script>
        <script>
            grecaptcha.ready(function() {
                // Находим все формы с веб-формами (можно уточнить селектор)
                var forms = document.querySelectorAll("form");
                forms.forEach(function(form) {
                    // Добавляем скрытое поле, если его нет
                    if (!form.querySelector(\'[name="g-recaptcha-response"]\')) {
                        var input = document.createElement("input");
                        input.type = "hidden";
                        input.name = "g-recaptcha-response";
                        form.appendChild(input);
                    }
                    
                    // При отправке формы получаем токен и подставляем в скрытое поле
                    form.addEventListener("submit", function(e) {
                        e.preventDefault();
                        var thisForm = this;
                        grecaptcha.execute("' . $siteKey . '", {action: "submit_form"}).then(function(token) {
                            thisForm.querySelector(\'[name="g-recaptcha-response"]\').value = token;
                            thisForm.submit();
                        });
                    });
                });
            });
        </script>';
        $content = str_replace('</head>', $script . '</head>', $content);
    }
}
?>

Важно: код выше перехватывает отправку любой формы на странице. Если на странице есть другие формы, которые не должны проверяться, уточните селектор (например, form.web-form).

Шаг 3. Проверка токена на сервере (через init.php)

Для проверки токена используем событие OnBeforeResultAdd модуля веб‑форм. Оно срабатывает перед сохранением результата. Добавим в init.php следующий код:

<?php
AddEventHandler('form', 'OnBeforeResultAdd', 'checkReCaptchaV3');

function checkReCaptchaV3($WEB_FORM_ID, &$arFields, &$arrVALUES) {
    // Если проверка уже пройдена или отключена, пропускаем
    if (defined('RECAPTCHA_SKIP') && RECAPTCHA_SKIP) return true;

    $token = $_POST['g-recaptcha-response'] ?? '';
    if (!$token) {
        global $APPLICATION;
        $APPLICATION->ThrowException('Не пройдена проверка reCAPTCHA (отсутствует токен).');
        return false;
    }

    $secretKey = 'ВАШ_SECRET_KEY';
    // Формируем запрос к Google API
    $url = 'https://www.google.com/recaptcha/api/siteverify';
    $data = [
        'secret' => $secretKey,
        'response' => $token,
        'remoteip' => $_SERVER['REMOTE_ADDR']
    ];

    $options = [
        'http' => [
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data)
        ]
    ];
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if ($result === false) {
        global $APPLICATION;
        $APPLICATION->ThrowException('Не удалось проверить reCAPTCHA. Попробуйте позже.');
        return false;
    }

    $response = json_decode($result, true);
    // Проверяем успешность и оценку (score)
    if (!$response['success'] || $response['score'] < 0.5) {
        global $APPLICATION;
        $APPLICATION->ThrowException('Не пройдена проверка reCAPTCHA (подозрение на бота).');
        return false;
    }

    // Опционально: проверяем action
    if ($response['action'] !== 'submit_form') {
        global $APPLICATION;
        $APPLICATION->ThrowException('Ошибка проверки reCAPTCHA.');
        return false;
    }

    return true;
}
?>

В этом коде мы проверяем:

  • наличие токена в POST‑запросе;
  • валидность токена через запрос к Google;
  • значение score (рекомендуемый порог — 0.5, можно изменить под свои нужды);
  • совпадение action с тем, что было указано в JavaScript.

Если проверка не пройдена, выбрасывается исключение, и результат формы не сохраняется — пользователь увидит сообщение об ошибке.

Шаг 4 Тестирование

После внесения всех изменений обязательно проверьте работу формы:

  • откройте страницу с формой, убедитесь, что скрипты загружаются;
  • отправьте форму — запрос должен пройти успешно;
  • попробуйте имитировать бота (например, отправив запрос без токена) — форма должна отклонить отправку.

Возможные доработки

  • Добавьте логирование неудачных попыток для анализа.
  • Настройте порог score в зависимости от чувствительности формы.
  • Используйте разные ключи для разных форм/разделов сайта.

Заключение

Интеграция Google reCAPTCHA v3 через init.php позволяет защитить веб‑формы Битрикс от спама, не мешая реальным пользователям. Такой подход не требует изменения ядра и легко настраивается под конкретные задачи. Главное — не забывать регулярно обновлять ключи и следить за статистикой в консоли Google, чтобы вовремя корректировать порог срабатывания.

Хотите освоить SQL для работы с данными?

В SQLka можно изучать SQL последовательно или готовиться к собеседованиям. Запросы выполняются прямо в браузере — устанавливать базу данных не нужно.

sqlka.ru

support@sqlka.ru

Дальше по теме

1С-Битрикс

Логирование в 1С-Битрикс: полное руководство для разработчика

Полное руководство по логированию в 1С-Битрикс: какие логгеры есть, как их настроить, форматировать сообщения и подключать к своим классам. Примеры кода и советы по использованию PSR-3

sqlka.ruЧтение: 4 мин.
1С-Битрикс

Как настроить Open Graph в 1С-Битрикс для автоматического формирования превью в соцсетях

Пошаговая инструкция по настройке Open Graph в 1С-Битрикс для автоматического формирования превью при публикации новостей в социальных сетях. Примеры кода и пояснения.

sqlka.ruЧтение: 3 мин.
← Все статьи