Aumenta la seguridad de tus formularios gracias a recaptcha de google.
Introduccióna recaptcha y jQuery
Aplicable a cualquier tipo de formulario, login, registro, contacto, etc.
1. Evita el spam en tus formularios
Introducción a
reCAPTCHA 3.0
2. Deja que la IA de Google se encargue.
Analiza los movimientos del usuario para generar una puntuación entre 0 y 1.
Cuando la puntuación es más cercana a 1 querrá decir que es un usuario real quien ha
cumplimentado y enviado el formulario.
Por el contrario si la puntuación es más cercana a 0 estaremos ante un posible bot de envío
de spam.
2
3. Diferencias entre V3.0 y V2.0
reCAPTCHA 3.0
Amigable con el usuario.
Verificación mediante puzle.
reCAPTCHA 2.0
Amigable con el usuario.
Verificación mediante puzle.
3
4. Primeros pasos
Accederemos a la página de google developers y
registramos nuestro dominio para:
● Que no se bloqueen las peticiones.
● Obtener las claves de la API.
https://www.google.com/recaptcha/admin/create
Podemos añadir más de un dominio en el mismo
registro.
4
5. Keys de la API
Las podemos consultar cuando queramos.
5
8. Introducción a jQuery
Fuente: jQuery
JQuery es una librería de JavaScript. Esta librería
de código abierto, simplifica la tarea de
programar en JavaScript.
8
12. <style>
input, textarea{
background: #fdfafa;
padding: 15px 30px;
border: 1px solid #efe7e7;
margin-bottom: 30px;
border-radius: 30px;
-webkit-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
width: 100%;
padding: 10px 12px;
outline: 0;
}
</style>
Creación del formulario
Después de la etiqueta
<title> agregaremos un poco
de estilo al formulario.
Que sea un ejemplo sencillo no
quiere decir que tenga que ser feo
12
13. Pero lo primero es lo primero, ¡que botón
más feo!
Añadiremos a la etiqueta <button> las
clases:
● btn
● btn-block
● btn-outline-info
Vista previa del formulario
Muy bonito ¿no?
¡¡¡Pero no vale de nada si cualquier bot
nos puede enviar spam!!!!
13
14. Programar el formulario
¡Llegó la hora de nuestro querido amigo JavaScript!
Vamos a darle funcionalidad a nuestro formulario
de contacto.
Para eso vamos a crear nuestro propio script justo
antes de cerrar la etiqueta <body>.
En este script crearemos una función dentro del
evento submit del formulario para recoger los
datos y poco a poco la convertiremos en la
validación que buscamos con reCAPTCHA.
<script>
$("#formulario").submit(function (e){
e.preventDefault();
nombre = $('#nombre').val();
email = $('#email').val();
mensaje = $('#mensaje').val();
});
</script>
14
15. Verificando el funcionamiento
¿Muy bonita la función no? Pero no hace nada.
Para comprobar que estamos recogiendo la
información de nuestro formulario
correctamente, lo que haremos es mostrar en la
consola esa información, para ello añadiremos
alguna línea a nuestro script, quedando así:
<script>
$("#formulario").submit(function (e){
e.preventDefault();
nombre = $('#nombre').val();
email = $('#email').val();
mensaje = $('#mensaje').val();
console.log("Nombre: "+nombre);
console.log("Email: "+email);
console.log("Mensaje: "+mensaje);
});
</script>
Para comprobar que funciona abriremos la consola
de nuestro navegador y recargamos la página.
15
17. LLamando a la API
Ahora que nuestro formulario funciona,
es momento de llamar a la API de
Google para que nos diga si quien
envía el formulario es una persona real.
Crearemos una función donde
realizaremos la llamada.
function envioFormulario(e) {
grecaptcha.ready(function () {
grecaptcha.execute('PUBLIC_KEY', {
action: 'submit'
}).then(function (token) {
//Tu codigo al recibir la respuesta
});
});
}
Sustituir PUBLIC_KEY por la clave de sitio
web que obtenemos al registrar el dominio
17
18. Modificando el evento submit
Una vez tengamos la función que va a llamar
a la api, tendremos que llamarla cuando se
vaya a enviar el formulario.
Para ello modificaremos el código de la
página 14, quedando así:
$("#formulario").submit(function (e) {
e.preventDefault();
envioFormulario(e);
});
18
21. Preparando el envío
La llamada nos devolverá un token que deberemos procesar
junto con el contenido de los campos del formulario.
Para poder enviar ese token, una vez lo recibamos lo
guardaremos en un campo oculto de nuestro formulario.
//Tu codigo al recibir la respuesta
$('#formulario').prepend('<input type="hidden" name="token" value="' + token +'">');
21
22. Enviando la información
Una vez tengamos el token
almacenado, realizaremos una
llamada ajax al archivo php
donde procesaremos la
información como haríamos con
un formulario normal.
$.ajax({
type: "POST",
url: "contacto.php",
data: $('#formulario').serialize(),
enctype: "application/json",
dataType: 'json',
success: function (data) {
//Tu codigo al recibir el OK del php
},
error: function (xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
}
});
22
24. Creando contacto.php
En este archivo recibiremos la información
del formulario y del análisis del reCAPTCHA
para que, en función de la puntuación
obtenida hacer lo que necesitemos.
<?php
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$mensaje = $_POST['mensaje'];
$token = $_POST['token'];
24
25. Volviendo a llamar a la API
Esta vez realizaremos la llamada con
nuestra key privada y el token que
recibimos en la llamada anterior.
Justo después de almacenar los datos
del formulario en variables
llamaremos a la API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
"https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
http_build_query(array('secret' => 'PRIVATE_KEY',
'response' => $token)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
curl_close($ch);
$response = json_decode($res, true);
Sustituir PRIVATE_KEY por la clave secreta
que obtenemos al registrar el dominio
25
26. Volviendo a llamar a la API
En $response obtenemos el resultado del análisis que ha hecho reCAPTCHA en
nuestra web. Podemos ver todo el contenido del array print_r($response)
En este caso analizaremos $response[“success”] y $response[“score”], donde
tendremos el estado (si ha funcionado o dado error) y la puntuación.
Si success es 1 es que todo ha ido bien.
En nuestro caso tomaremos como válidas las puntuaciones superiores a 0.5
En caso de que se cumplan las dos condiciones, almacenaremos la información o
enviaremos un email, lo que queramos hacer con esos datos
Código enla siguiente página ->
26
27. Volviendo a llamar a la API
if (($response["success"] == '1' && $response["score"] >= 0.5)) {
//Hacer lo que sea con la informacion, envio de email, guardado en bbdd, etc
$resultado = array('resultado' => true);
echo json_encode($resultado);
} else {
$resultado = array('resultado' => false);
echo json_encode($resultado);
}
27
29. Feedback al usuario
Una vez enviemos el formulario
daremos al usuario un mensaje de
estado.
Para ello crearemos el siguiente
elemento justo después de cerrar el div
class=”container”
<div class="row justify-content-center">
<div class="col-12">
<div id="resultado" class="text-center">
</div>
</div>
</div>
29
30. Feedback al usuario
if (data.resultado) {
$('#resultado').html('<span style="color:green" > Mensaje enviado!!</span>');
} else {
$('#resultado').html('<span style="color:red" > Error al enviar mensaje. </span>');
}
Volvemos a nuestra función en javascript y dentro de
success: function (data){}
añadimos lo siguiente:
30