Solución:
Lo bueno del nuevo Google Recaptcha es que la validación ahora está completamente encapsulada en el widget. Eso significa que el widget se encargará de hacer preguntas, validando las respuestas hasta que determine que un usuario es en realidad un humano, solo entonces obtienes un g-recaptcha-respuesta valor.
Pero eso no mantiene su sitio a salvo de la falsificación de solicitudes de clientes HTTP.
Cualquiera con conocimientos de HTTP POST podría poner datos aleatorios dentro del g-recaptcha-respuesta campo de formulario y siga su sitio para que piense que este campo fue proporcionado por el widget de Google. Vos tambien tengo para validar este token.
En el habla humana sería como,
- Tu servidor: Hola 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 comprobar esta ficha … sí, recuerdo a este tipo que le dio esta ficha … sí, está hecho de carne y hueso, déjalo pasar.
- Tu servidor: Hola Google, hay otro tipo que me dice que es un humano. También me dio una ficha.
- Google: Hmm … es la misma ficha que me diste la última vez … Estoy bastante seguro de que este tipo está tratando de engañarte. Dile que salga de tu sitio.
Validar la respuesta es realmente sencillo. 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 cadena_respuesta con el valor que obtuviste anteriormente por g-recaptcha-respuesta campo.
Obtendrá una respuesta JSON con un éxito campo.
Más información aquí:
https://developers.google.com/recaptcha/docs/verify
Editar: en realidad es un POST, según la documentación aquí.
Un método que utilizo 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 JsonObject.
Verifique que el campo de éxito sea 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;
}
Hola, curioso, también puedes validar tu recaptcha de Google en el lado del cliente. 100% trabajo para que pueda verificar su recaptcha de google, solo vea el código a continuación
Este código en el cuerpo 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 cabecera de guardia get_action(this)
botón de formulario de método:
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;
}
}