your verifyresponse verifying validate that solutions site not google detected check java javascript recaptcha

java - verifyresponse - Google reCAPTCHA: cómo obtener la respuesta del usuario y validarla en el servidor



validate captcha (3)

Hola, curioso, puede validar su Google Recaptcha en el lado del cliente. También me sirve al 100% para verificar su Google Recaptcha.
Este código en el cuerpo del 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" />

Este código se coloca en la sección de get_action(this) botón de formulario del método 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; } }

Estoy haciendo una aplicación web Java (JSP + Servlet) (entiendo que esta pregunta es independiente de la tecnología). Espero utilizar el último servicio reCAPTCHA de Goolge.

Estoy jugando con un ejemplo de Goolge reCAPTCHA encontrado aquí:

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>

Puedo ver la imagen recaptcha mostrada de la siguiente manera:

Cuando verifico "No soy un robot", obtengo lo siguiente:

Como puede ver, hay un botón Verificar y, según mis pruebas, la respuesta del usuario se envía a Google para su verificación.

¿Cómo puedo obtener la respuesta del usuario para poder verificar la respuesta del usuario con mi propio código backend (como lo sugiere Google en https://developers.google.com/recaptcha/docs/verify )?

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

En el lado del servidor, puedo, al hacer clic en el botón "Enviar", obtener la entrada del usuario del parámetro "g-recaptcha-response" solo cuando un usuario se verifica correctamente con Google primero. De lo contrario, "g-recaptcha-response" está en blanco en el lado del servidor. Esto significa que puedo hacer la verificación del lado del servidor solo después de que la verificación del lado del cliente haya sido exitosa. Si es así, ¿cuál es el punto de hacer otra verificación en el lado del servidor, cuál es la opción provista por Google reCAPTHA?

¿Me falta algo?


Lo bueno de la nueva Recaptcha de Google es que la validación ahora está completamente encapsulada en el widget. Eso significa que el widget se encargará de hacer preguntas y validará las respuestas hasta que determine que un usuario es realmente un ser humano, solo así obtendrá un valor de g-recaptcha-response .

Pero eso no mantiene a su sitio a salvo de la falsificación de solicitud de cliente HTTP.

Cualquier persona con conocimiento de HTTP POST podría colocar datos aleatorios dentro del campo de formulario g-recaptcha-response , y seguir su sitio para que piense que Google Widget proporcionó este campo. Así que tienes que validar este token.

En lenguaje humano sería como,

  • Su servidor : Oye Google, hay un tipo que me dice que no es un robot. Dice que ya verificaste que es un humano y me dijo que te diera esta ficha como prueba de ello.
  • Google : Hmm ... déjame revisar esta ficha ... sí, recuerdo a este tipo que le di esta ficha ... sí, está hecho de carne y hueso lo dejó pasar.
  • Su servidor : Oye, Google, hay otro tipo que me dice que es un humano. También me dio un token.
  • Google : Hmm ... es la misma señal que me diste la última vez ... Estoy bastante seguro de que este tipo está tratando de engañarte. Dile que salga de su sitio.

Validar la respuesta es realmente fácil. Simplemente haga una solicitud GET para

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

Y reemplace el response_string con el valor que obtuvo anteriormente en el campo g-recaptcha-response .

Obtendrá una respuesta JSON con un campo de éxito .

Más información aquí: https://developers.google.com/recaptcha/docs/verify


Un método que uso en mi servlet de inicio de sesión para verificar las respuestas de reCaptcha. Utiliza clases del paquete java.json. Devuelve la respuesta de la API en un objeto JsonObject.

Compruebe el campo de éxito para ver si es verdadero o falso

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