У меня есть форма с несколькими полями и recaptcha. Если одно из полей недействительно при нажатии кнопки отправки и recaptcha действителен, он отправляет форму, но проверяет эти поля и возвращает пользователю сообщение об ошибке в случае сбоя.

На этом этапе рекапча остается проверенной и проверенной на веб-интерфейсе. Если пользователь исправляет проблему в поле, в котором было сообщение об ошибке, и повторно отправляет форму, ответ от recaptcha будет ложным и, следовательно, не подтвержден.

enter image description here

После ввода действительного адреса электронной почты я получаю следующее:

enter image description here

Моя функция, которая проверяет капчу, такова:

enter image description here

При значении false это приводит к тому сообщению об ошибке, которое отображается на скриншоте выше.

3
GGio 18 Апр 2016 в 19:39

2 ответа

Лучший ответ

Проверка рекапчи хороша только один раз.

У вас есть несколько возможных подходов:

  • Сохраните переменную сеанса, чтобы пользователь успешно выполнил капчу и не требует, чтобы она проходила проверку во второй раз. Обязательно очистите переменную при успешной отправке, иначе злоумышленник может решить один раз и отправить миллион раз.
  • Повторно отобразите капчу (используя вызов grecaptcha.render) и потребуйте от них заполнить ее снова, если отправка формы не удалась.
  • Не проверяйте капчу, пока не будут проверены все остальные поля.
5
ceejayoz 18 Апр 2016 в 16:43

Из официальных документов:

Если ваш веб-сайт выполняет проверку на стороне сервера с помощью запроса AJAX, вам следует проверять токен ответа reCAPTCHA пользователя (g-recaptcha-response) только один раз. Если попытка проверки была предпринята с определенным токеном, его нельзя использовать снова. Вам нужно будет вызвать grecaptcha.reset (), чтобы попросить конечного пользователя снова подтвердить с помощью reCAPTCHA.

Это означает, что ваша функция verifyCaptcha () должна запускаться только один раз. Сохраните флаг проверки в переменной сеанса и просто проверьте, существует ли он и действителен ли он для каждого последующего запроса.

2
Dan H 18 Апр 2016 в 16:46