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

YaCaptcha

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

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

Назначение: Сервис валидации Yandex SmartCaptcha. Реализует серверную проверку токена, полученного от фронтенда, и предоставляет механизмы кэширования результата в сессии для снижения количества внешних запросов. Зависимости:

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

validateToken(string $token = '', string $userIp = '')

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

  • Авто-определение IP: Если IP не передан явно, использует GeoIp\Manager::getRealIp().
  • Исключения: Выбрасывает Exception, если токен пуст или проверка в Яндексе не прошла.
  • Отключение: Всегда возвращает true, если капча выключена в настройках или проект запущен локально.

isValidYaCaptchaResult(string $token, string $userIp) (private)

Проверяет токен через API Яндекса или берет результат из кэша сессии.

  • Кэширование: Если в настройках включена опция yacaptcha_save_verification_result, метод сначала проверяет сессию. Если пользователь уже проходил капчу с этого же IP, повторный запрос к Яндексу не отправляется.
  • Обновление кэша: При успешном ответе от Яндекса записывает результат в сессию под ключом yacaptcha_result.

sendRequest(string $token, string $userIp) (private)

Выполняет низкоуровневый HTTP-запрос к серверам Яндекса через cURL.

  • Отказоустойчивость: Установлен таймаут в 1 секунду.
  • Важный нюанс: Согласно рекомендациям Яндекса, если сервер SmartCaptcha недоступен (HTTP-код не 200), метод возвращает status: ok, чтобы не блокировать работу пользователей из-за проблем на стороне сервиса защиты.

getClientKey() и isYaCaptchaDisabled()

  • getClientKey: Возвращает публичный ключ (client_key) для инициализации виджета на фронтенде.
  • isYaCaptchaDisabled: Проверяет настройки captcha_active (включена ли вообще) и captcha_inactive_local (нужно ли отключать на локальных машинах разработчиков).

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

Проверка токена в обработчике формы

use Xpage\Core\Service\Security\YaCaptcha;

$token = $_POST['smart-token'];

try {
if (YaCaptcha::validateToken($token)) {
// Капча пройдена успешно
}
} catch (\Exception $e) {
// Выводим ошибку: "Проверка не пройдена" или "Токен не получен"
echo $e->getMessage();
}

Технические особенности

  • Безопасность: При кэшировании результата в сессии обязательно проверяется соответствие IP-адреса. Это защищает от подмены сессии (Session Hijacking).
  • Настройки: Все ключи (Server Key, Client Key) и флаги активности подтягиваются из настроек модуля через Helper.
  • Формат ответа: Ожидает от Яндекса JSON-ответ с полем status.