Google reCAPTCHA: как получить ответ пользователя и подтвердить его на стороне сервера

Я использую веб-приложение Java (JSP + Servlet) (я понимаю, что этот вопрос не зависит от технологии). Я надеюсь использовать последнюю службу Goolge reCAPTCHA.

Я играю с примером Goolge reCAPTCHA, который можно найти здесь:

https://developers.google.com/recaptcha/docs/display#config

<html>
  <head>
    <title>reCAPTCHA demo: Simple page</title>
     <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  </head>
  <body>
    <form action="?" method="POST">
      <div class="g-recaptcha" data-sitekey="my_site_key"></div>
      <br/>
      <input type="submit" value="Submit">
    </form>
  </body>
</html>

Я могу видеть отображаемое изображение recaptcha следующим образом:

enter image description here

Когда я проверяю "Я не робот", я получаю следующее:

enter image description here

Как вы можете видеть, есть кнопка Verify и на основе моих тестов пользовательский ответ отправляется в Google для проверки.

Как я могу получить ответ пользователя, чтобы я мог проверить ответ пользователя в моем собственном бэкэнд-коде (как предложено Google в https://developers.google.com/recaptcha/docs/verify).

g-recaptcha-response POST parameter when the user submits the form on your site

На стороне сервера я могу, нажав кнопку "Отправить", получить вход пользователя из параметра "g-recaptcha-response" только в том случае, если пользователь сначала успешно проверен с помощью Google. В противном случае "g-recaptcha-response" пуст на стороне сервера. Это означает, что я могу выполнять проверку на стороне сервера только после успешной проверки на стороне клиента. Если да, то какова точка выполнения другой проверки на стороне сервера, которая является опцией, предоставляемой Google reCAPTHA?

Не хватает ли чего-нибудь?

Ответы

Ответ 1

Замечательная вещь о новом Google Recaptcha заключается в том, что валидация теперь полностью инкапсулирована в виджет. Это означает, что виджет позаботится о том, чтобы задавать вопросы, проверяя ответы до тех пор, пока не определит, что пользователь на самом деле является человеком, только тогда вы получите значение g-recaptcha-response.

Но это не защищает ваш сайт от подделки запроса HTTP-клиента.

Любой, у кого есть HTTP POST-знание, может помещать случайные данные в поле формы ответа g-recaptcha-response, а также ваш сайт, чтобы сделать это, что это поле было предоставлено виджлером google. Таким образом, вы должны проверить этот токен.

В человеческой речи это было бы,

  • Ваш сервер: Эй, Google, там чувак, который говорит мне, что он не робот. Он говорит, что вы уже подтвердили, что он человек, и он сказал мне дать вам этот знак как доказательство этого.
  • Google: Хм... позвольте мне проверить этот знак... да, я помню этого чувака, я дал ему этот знак... да, он сделал из плоти и кости, пропустил его.
  • Ваш сервер: Эй, Google, есть еще один чувак, который говорит мне, что он человек. Он также дал мне токен.
  • Google: Хм... это то же самое, что ты дал мне в прошлый раз... Я почти уверен, что этот парень пытается тебя обмануть. Скажите ему, чтобы он сошел с вашего сайта.

Проверка ответа очень проста. Просто сделайте запрос GET для

https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

И замените response_string на значение, полученное ранее в поле g-recaptcha-response.

Вы получите ответ JSON с полем успеха.

Дополнительная информация здесь: https://developers.google.com/recaptcha/docs/verify

Ответ 2

Метод, который я использую в своем сервлете регистрации для проверки ответов reCaptcha. Использует классы из пакета java.json. Возвращает ответ API в JsonObject.

Проверьте поле успеха для истинного или ложного

private JsonObject validateCaptcha(String secret, String response, String remoteip)
{
    JsonObject jsonObject = null;
    URLConnection connection = null;
    InputStream is = null;
    String charset = java.nio.charset.StandardCharsets.UTF_8.name();

    String url = "https://www.google.com/recaptcha/api/siteverify";
    try {            
        String query = String.format("secret=%s&response=%s&remoteip=%s", 
        URLEncoder.encode(secret, charset), 
        URLEncoder.encode(response, charset),
        URLEncoder.encode(remoteip, charset));

        connection = new URL(url + "?" + query).openConnection();
        is = connection.getInputStream();
        JsonReader rdr = Json.createReader(is);
        jsonObject = rdr.readObject();

    } catch (IOException ex) {
        Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }

        }
    }
    return jsonObject;
}

Ответ 3

Привет, вы можете проверить свою рекламу google на стороне клиента также 100% -ная работа, чтобы проверить вашу рекламу google чуть ниже кода
Этот код в корпусе html:

 <div class="g-recaptcha" id="rcaptcha" style="margin-left: 90px;" data-sitekey="my_key"></div>
 <span id="captcha" style="margin-left:100px;color:red" />

Этот код помещается в головную часть на кнопку формы get_action(this) вызова

:
function get_action(form) {

var v = grecaptcha.getResponse();
if(v.length == 0)
{
    document.getElementById('captcha').innerHTML="You can't leave Captcha Code empty";
    return false;
}
 if(v.length != 0)
 {
    document.getElementById('captcha').innerHTML="Captcha completed";
    return true; 
 }
}