Інтеграція 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)) {
// Логуємо спроbu спаму, повертаємо помилку
$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 год |







