web-dev-qa-db-fra.com

Google reCAPTCHA: comment obtenir la réponse de l'utilisateur et la valider côté serveur

Je suis en train de faire une application Web Java (JSP + Servlet) (je comprends que cette question ne dépend pas de la technologie). J'espère utiliser le dernier service Goolge reCAPTCHA.

Je joue avec un exemple Goolge reCAPTCHA trouvé ici:

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>

Je suis capable de voir l'image recaptcha affichée comme suit:

enter image description here

Lorsque je coche "Je ne suis pas un robot", je reçois le message suivant:

enter image description here

Comme vous pouvez le constater, il existe un bouton Vérifier et, selon mes tests, la réponse de l'utilisateur est envoyée à Google pour vérification.

Comment puis-je obtenir la réponse de l'utilisateur afin de pouvoir la vérifier dans mon propre code d'arrière-plan (suggéré par Google à l'adresse suivante: https://developers.google.com/recaptcha/docs/verify ).

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

Du côté du serveur, je peux, en cliquant sur le bouton "Soumettre", obtenir la saisie de l'utilisateur à partir du paramètre "g-recaptcha-response" uniquement lorsqu'un utilisateur a été vérifié avec succès auprès de Google. Sinon, "g-recaptcha-response" est vide du côté du serveur. Cela signifie que je ne peux effectuer une vérification côté serveur qu'après le succès de la vérification du côté client. Si tel est le cas, à quoi sert-il d'effectuer une autre vérification côté serveur, quelle est l'option proposée par Google reCAPTHA?

Est-ce que je manque quelque chose?

28
curious1

Ce qui est bien avec le nouveau Google Recaptcha, c'est que la validation est maintenant complètement encapsulée dans le widget. Cela signifie que le widget se chargera de poser des questions et de valider les réponses jusqu’à ce qu’il détermine qu’un utilisateur est réellement un humain. Ce n’est qu’alors que vous obtenez une g-recaptcha-response valeur.

Mais cela ne protège pas votre site de la falsification de requêtes client HTTP.

Toute personne disposant de la connaissance HTTP POST) peut insérer des données aléatoires dans le champ de formulaire g-recaptcha-response , et suivre votre site pour lui faire croire que ce champ a été fourni par le widget Google, de sorte que vous ayez pour valider ce jeton.

Dans le langage humain, ce serait comme

  • Votre serveur : Hey Google, il y a un mec qui me dit qu'il n'est pas un robot. Il dit que vous avez déjà vérifié qu'il est humain et il m'a dit de vous donner ce gage comme preuve.
  • Google : Hmm ... laisse-moi vérifier ce gage ... oui je me souviens de ce mec que je lui ai donné ce jeton ... ouais il est fait de chair et d'os le laisse passer.
  • Votre serveur : Hey Google, il y a un autre type qui me dit qu'il est un humain. Il m'a aussi donné un gage.
  • Google : Hmm ... c'est la même chose que vous m'avez donnée la dernière fois ... Je suis à peu près sûr que ce mec essaie de vous duper. Dites-lui de quitter votre site.

Valider la réponse est vraiment facile. Il suffit de faire une demande GET à

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

Et remplacez la chaîne de réponse par la valeur que vous aviez précédemment obtenue par la g-recaptcha-response champ.

Vous obtiendrez une réponse JSON avec un champ success .

Plus d'informations ici: https://developers.google.com/recaptcha/docs/verify

78
TheRueger

Une méthode que j'utilise dans mon servlet de connexion pour vérifier les réponses reCaptcha. Utilise les classes du package Java.json. Renvoie la réponse de l'API dans un JsonObject.

Vérifiez le champ de réussite pour vrai ou faux

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;
}
10
Rob Kraft

Bonjour curieux, vous pouvez également valider votre recaptcha google côté client 100% de travail pour que je vérifie votre google recaptcha juste voir le code ci-dessous
Ce code dans le corps 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" />

Ce code est placé en tête de l’appel get_action(this) bouton du formulaire:

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; 
 }
}
3
Pravin Sharma