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.