Документация

Как подменяется капча Битрикса

Модуль ничего не знает о конкретных формах. Он опирается на то, что штатная капча Битрикса всегда выглядит одинаково: картинка /bitrix/tools/captcha.php и поле ввода captcha_word рядом.

Что происходит с готовой страницей

Перед отдачей страницы модуль:

  1. заменяет картинку капчи на блок проверки Яндекса — div с классом smartcaptcha;
  2. прячет поле ввода и подставляет в него значение, которое пройдёт проверку Битрикса;
  3. заменяет подписи и тексты ошибок на понятные для новой проверки.

Замена подписей работает и в ответах в формате JSON: ajax-формы получают тот же текст, что и обычные страницы.

Что происходит с отправкой

Отправленная форма приходит с ответом Яндекса в поле smart-token. Модуль подтверждает ответ у smartcaptcha.cloud.yandex.ru и, если проверка пройдена, подставляет ожидаемое значение штатной капчи в запрос и в сессию. Дальше компонент Битрикса работает обычным порядком: он сверяет свою капчу и видит, что она сошлась.

Проверка выполняется один раз за запрос: результат запоминается, и повторные обращения к нему не идут в Яндекс снова.

Отсюда главное ограничение: модуль защищает формы, которые пользуются капчей Битрикса. Форма со своим полем проверки или вовсе без капчи останется без защиты — подменять там нечего.

Кодировка страницы

Подмена делается, только если кодировка ответа совпадает с кодировкой сайта. Страница в Windows-1251 на сайте в UTF-8 (или наоборот) пропускается целиком: подстановка в чужой кодировке испортила бы разметку. Случай редкий, но он объясняет ситуацию, когда на всём сайте капча заменяется, а на одной странице — нет.

Переопределённый класс капчи

Модуль подменяет класс CCaptcha. Если тот же класс переопределён чем-то ещё — своим кодом в /bitrix/php_interface/init.php или другим модулем, — подмена не состоится: в системе может быть только одно объявление класса.

Молчать об этом модуль не станет: в админке появится уведомление со ссылкой на файл, где объявлен чужой класс. Пока конфликт не разобран, формы работают со штатной капчой.