Перейти к основному содержимому

ReCaptcha

!!! Класс не вызывается напрямую, а работает через фасад Xpage\Core\Facade\Captcha, который сам решает, использовать ReCaptcha или YaCaptcha на основе настроек !!!

Класс: Xpage\Core\Service\Security\ReCaptcha

Назначение: Сервис валидации Google ReCaptcha v3. Обеспечивает защиту от ботов, анализирует балл пользователя и уменьшает нагрузку на API через систему кэширования в сессии. Зависимости:

  • Ядро: Bitrix\Main\Application, Bitrix\Main\Service\GeoIp.
  • Хелпер настроек: Xpage\Core\Facade\Helper.

validateToken(string $token = '', float $score = 0)

Основной метод проверки токена.

  • Балл (Score): Если $score не передан, метод берет значение по умолчанию из настроек модуля (recaptcha_default_score). Обычно это 0.5.
  • IP-адрес: Автоматически определяет реальный IP пользователя через GeoIp\Manager.
  • Исключения: Если проверка не пройдена или токен отсутствует, выбрасывается Exception с локализованным текстом ошибки.
  • Режим разработки: Автоматически возвращает true, если проверка отключена в админке или проект запущен локально (зависит от настроек).

isValidReCaptchaResult(string $token, string $userIp, float $score) (private)

Проверяет токен через Google или использует данные из сессии.

  • Оптимизация (Кэш сессии): Если включена опция captcha_save_verification_result, класс проверяет, не проходил ли уже этот пользователь проверку. Если в сессии есть результат с нужным или более высоким баллом для этого же IP, запрос к Google не дублируется.
  • Запись результата: При успешном ответе от Google сохраняет балл и IP в сессию под ключом recaptcha_result.

sendRequest(string $token) (private)

Низкоуровневая отправка запроса на серверы Google (siteverify).

  • Использует cURL для передачи secret_key и полученного от пользователя токена.
  • Возвращает декодированный JSON-ответ от Google (содержащий success, score, action и др.).

getSiteKey()

Возвращает публичный ключ (site_key), который необходим фронтенду для генерации токена.


Примеры использования

Проверка в обработчике формы (через фасад)

Лучше использовать универсальный фасад Captcha, но логика вызова данного сервиса выглядит так:

use Xpage\Core\Service\Security\ReCaptcha;

$token = $request->getPost('token');

try {
// Проверяем токен, ожидая, что балл пользователя выше 0.7 (очень надежный)
if (ReCaptcha::validateToken($token, 0.7)) {
// Действие разрешено
}
} catch (\Exception $e) {
echo "Ошибка безопасности: " . $e->getMessage();
}