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

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

Как я могу получить ответ пользователя, чтобы я мог проверить ответ пользователя в моем собственном коде бэкэнда (как предложено Google athttps://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?

Я что-нибудь пропустил?

3 ответов


крутая вещь о новом 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


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

Проверьте поле успеха для true или false

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;
}

Привет любопытно, вы можете проверить свой Google recaptcha на стороне клиента также 100% работают для меня, чтобы проверить ваш Google recaptcha просто см. ниже код
этот код в теле 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; 
 }
}