Google reCAPTCHA v3 — это современный способ защиты сайта от автоматических отправок (ботов), который не требует от пользователя вводить коды или отмечать картинки. Вместо этого анализируется поведение посетителя и присваивается «оценка» (score) от 0.0 (бот) до 1.0 (человек). В этой статье мы рассмотрим, как встроить reCAPTCHA v3 в стандартные веб‑формы 1С‑Битрикс с помощью файла init.php.
Преимущества reCAPTCHA v3
- Невидима для пользователя — не требует кликов и ввода текста.
- Адаптивна — анализирует реальные действия на странице.
- Позволяет задать порог срабатывания (например, отсекать запросы с оценкой ниже 0.5).
Шаг 1. Получение ключей reCAPTCHA v3
- Перейдите на страницу администрирования reCAPTCHA.
- Зарегистрируйте новый сайт, выберите тип reCAPTCHA v3.
- Укажите домены, на которых будет использоваться капча.
- После создания вы получите два ключа: 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, чтобы вовремя корректировать порог срабатывания.
Google reCAPTCHA v3 — это современный способ защиты сайта от автоматических отправок (ботов), который не требует от пользователя вводить коды или отмечать картинки. Вместо этого анализируется поведение посетителя и присваивается «оценка» (score) от 0.0 (бот) до 1.0 (человек). В этой статье мы рассмотрим, как встроить reCAPTCHA v3 в стандартные веб‑формы 1С‑Битрикс с помощью файла
init.php.Преимущества reCAPTCHA v3
Шаг 1. Получение ключей reCAPTCHA v3
Вместо проверки
REQUEST_URIможно использовать другие условия, например наличие определённого компонента или ID формы.Шаг 2. Добавление скрытого поля с токеном в форму
Для отправки токена reCAPTCHA на сервер необходимо добавить скрытое поле в каждую веб‑форму. Это можно сделать через настройки формы в административной панели (создать поле типа «Скрытое» с именем
g-recaptcha-response) или прямо в шаблоне формы.Проще всего добавить код инициализации reCAPTCHA в конец страницы, который будет заполнять скрытое поле перед отправкой. Расширим наш обработчик в
init.php:Важно: код выше перехватывает отправку любой формы на странице. Если на странице есть другие формы, которые не должны проверяться, уточните селектор (например,
form.web-form).Шаг 3. Проверка токена на сервере (через init.php)
Для проверки токена используем событие
OnBeforeResultAddмодуля веб‑форм. Оно срабатывает перед сохранением результата. Добавим вinit.phpследующий код:В этом коде мы проверяем:
score(рекомендуемый порог — 0.5, можно изменить под свои нужды);actionс тем, что было указано в JavaScript.Если проверка не пройдена, выбрасывается исключение, и результат формы не сохраняется — пользователь увидит сообщение об ошибке.
Шаг 4 Тестирование
После внесения всех изменений обязательно проверьте работу формы:
Возможные доработки
scoreв зависимости от чувствительности формы.Заключение
Интеграция Google reCAPTCHA v3 через
init.phpпозволяет защитить веб‑формы Битрикс от спама, не мешая реальным пользователям. Такой подход не требует изменения ядра и легко настраивается под конкретные задачи. Главное — не забывать регулярно обновлять ключи и следить за статистикой в консоли Google, чтобы вовремя корректировать порог срабатывания.