Как подменяется капча Битрикса
Модуль ничего не знает о конкретных формах. Он опирается на то, что штатная капча Битрикса всегда
выглядит одинаково: картинка /bitrix/tools/captcha.php и поле ввода captcha_word рядом.
Что происходит с готовой страницей
Перед отдачей страницы модуль:
- заменяет картинку капчи на блок проверки Яндекса —
divс классомsmartcaptcha; - прячет поле ввода и подставляет в него значение, которое пройдёт проверку Битрикса;
- заменяет подписи и тексты ошибок на понятные для новой проверки.
Замена подписей работает и в ответах в формате JSON: ajax-формы получают тот же текст, что и обычные страницы.
Что происходит с отправкой
Отправленная форма приходит с ответом Яндекса в поле smart-token. Модуль подтверждает ответ у
smartcaptcha.cloud.yandex.ru и, если проверка пройдена, подставляет ожидаемое значение штатной
капчи в запрос и в сессию. Дальше компонент Битрикса работает обычным порядком: он сверяет свою
капчу и видит, что она сошлась.
Проверка выполняется один раз за запрос: результат запоминается, и повторные обращения к нему не идут в Яндекс снова.
Отсюда главное ограничение: модуль защищает формы, которые пользуются капчей Битрикса. Форма со своим полем проверки или вовсе без капчи останется без защиты — подменять там нечего.
Кодировка страницы
Подмена делается, только если кодировка ответа совпадает с кодировкой сайта. Страница в Windows-1251 на сайте в UTF-8 (или наоборот) пропускается целиком: подстановка в чужой кодировке испортила бы разметку. Случай редкий, но он объясняет ситуацию, когда на всём сайте капча заменяется, а на одной странице — нет.
Переопределённый класс капчи
Модуль подменяет класс CCaptcha. Если тот же класс переопределён чем-то ещё — своим кодом в
/bitrix/php_interface/init.php или другим модулем, — подмена не состоится: в системе может быть
только одно объявление класса.
Молчать об этом модуль не станет: в админке появится уведомление со ссылкой на файл, где объявлен чужой класс. Пока конфликт не разобран, формы работают со штатной капчой.