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

je fais une application Web Java (JSP + Servlet) (je comprends que cette question est indépendante de la technologie). J'espère utiliser le dernier service Goolge reCAPTCHA.

je joue avec un exemple de reCAPTCHA Goolge 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 peux voir l'image affichée De recaptcha comme suit:

enter image description here

quand je vérifie "je suis pas un robot", j'ai le code suivant:

enter image description here

comme vous pouvez le voir, il y a un bouton vérifier et basé sur 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 pour que je puisse vérifier la réponse de l'utilisateur dans mon propre code d'arrière-plan (comme suggéré par Google à https://developers.google.com/recaptcha/docs/verify).

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

côté serveur, je peux, en cliquant sur le bouton "Soumettre" , obtenez l'entrée de l'utilisateur à partir du paramètre "g-recaptcha-réponse" seulement lorsqu'un utilisateur est vérifié avec succès avec Google en premier. Sinon, "g-recaptcha-response" est vide du côté serveur. Cela signifie que je ne peux effectuer la vérification côté serveur qu'après le succès de la vérification côté client. Si c'est le cas, à quoi sert de faire une autre vérification côté serveur, Quelle est L'option fournie par Google reCAPTHA?

est-ce que je manque quelque chose?

18
demandé sur curious1 2014-12-04 17:55:37

3 réponses

le truc cool avec le nouveau Google Recaptcha est que la validation est maintenant complètement encapsulée dans le widget. Cela signifie, que le widget prendra soin de poser des questions, validant les réponses jusqu'à ce qu'il détermine qu'un utilisateur est réellement un humain, seulement alors vous obtenez un g-recaptcha-réponse valeur.

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

N'importe qui avec la connaissance de HTTP POST pourrait mettre des données aléatoires à l'intérieur de l' g-recaptcha-réponse champ de formulaire, et le foll votre site pour le faire penser que ce champ a été fourni par google widget. Afin de vous pour valider ce jeton.

Dans le discours qu'il serait comme,

  • Votre Serveur
  • Google: Hmm... laissez-moi vérifier ce jeton... oui je me souviens de ce mec je lui donna ce jeton... ouais il est fait de chair et d'os laissez-lui grâce.
  • Votre Serveur
  • Google: Hmm... c'est le même jeton que vous m'avez donné la dernière fois... Je suis presque sûr que ce gars essaye de te duper. Dites-lui de descendre votre site.

Valider la réponse est très simple. Il suffit de faire une requête GET à

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

Et remplacer le responds_string avec la valeur que vous avez obtenu plus tôt par le g-recaptcha-réponse champ.

vous obtiendrez une réponse JSON avec un succès champ.

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

59
répondu TheRueger 2018-07-19 09:48:17

une méthode que j'utilise dans mon servlet de connexion pour vérifier les réponses reCaptcha. Utilise les classes du java.paquet json. Renvoie la réponse 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;
}
9
répondu Rob Kraft 2015-05-21 23:59:38

Salut curious, vous pouvez valider votre Google recaptcha côté client aussi 100% de travail pour moi, pour vérifier votre google recaptcha viens de voir code ci-dessous

ce code au 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 mis à la tête de la section sur appel get_action(this) méthode de bouton de 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
répondu Pravin Sharma 2015-08-11 21:47:37