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();
}