Интеграция 1С-Битрикс с Google reCAPTCHA
Спам через формы — форма обратной связи получает 500 заявок в сутки от ботов, отдел продаж тонет в мусоре, CRM засоряется. Стандартный модуль капчи Битрикса (bitrix:main.captcha) использует собственную реализацию, которую современные боты обходят. Google reCAPTCHA v3 решает задачу без раздражающих задачек для пользователя.
reCAPTCHA v2 vs v3
v2 — пользователь ставит галочку или решает задачу (выбрать светофоры). Встраивается явным виджетом. Защита надёжная, но ухудшает UX.
v3 — невидимая проверка, возвращает score от 0.0 (бот) до 1.0 (человек). Не прерывает пользователя. Рекомендуемый порог: score >= 0.5. Логика: при score < 0.5 можно показать v2 как дополнительную проверку или заблокировать отправку.
Регистрация ключей
В консоли Google reCAPTCHA (https://www.google.com/recaptcha/admin) регистрируем домен, получаем два ключа:
- Site key — публичный, вставляется во frontend.
-
Secret key — приватный, используется для серверной проверки. Хранить в
COptionили.env, не в коде.
Подключение на frontend
В шаблоне сайта в <head>:
<script src="https://www.google.com/recaptcha/api.js?render=SITE_KEY"></script>
Перед отправкой формы получаем токен:
grecaptcha.ready(function() {
grecaptcha.execute('SITE_KEY', {action: 'submit'}).then(function(token) {
document.getElementById('g-recaptcha-response').value = token;
document.getElementById('feedback-form').submit();
});
});
Скрытое поле g-recaptcha-response передаётся на сервер вместе с данными формы.
Серверная проверка в Битриксе
В обработчике формы (до записи в базу и отправки в CRM):
function verifyRecaptcha(string $token): bool {
$secretKey = COption::GetOptionString('site', 'recaptcha_secret');
$http = new \Bitrix\Main\Web\HttpClient();
$response = $http->post('https://www.google.com/recaptcha/api/siteverify', [
'secret' => $secretKey,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR'],
]);
$result = json_decode($response, true);
return $result['success'] === true && ($result['score'] ?? 0) >= 0.5;
}
// В обработчике формы:
$token = $_POST['g-recaptcha-response'] ?? '';
if (empty($token) || !verifyRecaptcha($token)) {
// Логируем попытку спама, возвращаем ошибку
$APPLICATION->ThrowException('Проверка не пройдена. Попробуйте ещё раз.');
return;
}
Интеграция со стандартными компонентами Битрикса
Для компонента bitrix:main.feedback — переопределяем шаблон компонента в /bitrix/templates/[шаблон]/components/bitrix/main.feedback/[вариант]/. Добавляем скрытое поле и JS-код в template.php. В result_modifier.php выполняем проверку токена и устанавливаем переменную $arResult['CAPTCHA_PASSED'].
Для кастомных Ajax-форм — проверка выполняется в контроллере или обработчике компонента до любых операций с данными.
Логирование и анализ блокировок
Пишем заблокированные попытки в таблицу через \Bitrix\Main\Application::getConnection()->query():
CREATE TABLE IF NOT EXISTS b_spam_log (
ID int AUTO_INCREMENT PRIMARY KEY,
DATE_CREATE datetime,
IP varchar(45),
SCORE float,
FORM_ID varchar(50),
ACTION varchar(50)
);
Анализ за неделю показывает паттерны атак — пиковые часы, IP-диапазоны, формы-мишени. На основе этого настраиваем дополнительные правила на уровне nginx.
Кейс: ложные срабатывания
Корпоративный клиент пожаловался, что форму заявки не может отправить из офиса. Причина: корпоративный прокси-сервер — весь трафик с одного IP. Google reCAPTCHA давала таким запросам низкий score из-за аномального паттерна. Решение: для авторизованных пользователей (B2B кабинет) reCAPTCHA не применялась — проверяем $USER->IsAuthorized() и пропускаем верификацию.
| Задача | Трудозатраты |
|---|---|
| Регистрация ключей и настройка frontend | 1–2 ч |
| Серверная проверка для одной формы | 2–3 ч |
| Интеграция в несколько форм/компонентов | 4–6 ч |
| Логирование и мониторинг | 2–3 ч |







