jueves, 22 de septiembre de 2011

Captcha invisible para tus formularios PHP


No es un secreto que los captcha son una incomodidas para nuestros usuarios, y sobre todo si lo que queremos a través de ese formulario en finalizar una venta, cuantas menos trabas le pongamos al usuario más sencillo será que finalice el proceso.

Pensando en esto, hace unos días me puse a hacer uno para algunos de nuestros proyectos y me salió uno bien sencillo que seguro que a más de uno le interesa.
El script consta de un sencillo archivo en php al que he llamado invisiblecaptcha.php:
1<?php
2 
3    // Captcha invisible
4    session_start();
5    $_SESSION['invisibleCaptcha'] = md5( rand( 0, 100000 ) );
6    header( 'Content-type: text/javascript' );
7    echo'document.write( "<input type=\'hidden\' name=\'invisibleCaptcha\' value=\' ' .$_SESSION['invisibleCaptcha'] . '\'/>");' );
8 
9?>
Se trata que desde nuestro html llamemos a este archivo como si se tratara de un javascript. Este genera un nuevo campo para el formulario llamado ‘invisibleCaptcha’ y oculto que contiene un valor aleatorio generado cada vez que se carga la página.

Esto se hace para diferenciar a un robot de una persona. Los robots no suelen ejecutar el javascript, y aunque lo hagan no lo hacen a la vez que el html y por tanto el archivo guardará valores diferentes para cada uno y podremos saber que se trata de un robot.

Un inconveniente sí que tiene, y es que para los usuarios que no tengan integrado javascript en su navegador o lo tengan desactivados, el formulario nunca llegará a su destino. Esto se puede solucionar añadiendo un mensaje de noscript diciéndole que lo active para poder enviar el formulario.

Ahora vamos con la integración en el HTML:
1<form method="post">
2    <input name="uno" type="text" />
3    <input type="submit" value="Enviar" />
4    <script type='text/javascript' src='invisiblecaptcha.php'></script>
5</form>
Este es un formulario de ejemplo sencillo que llama como script al php que hemos creado y que genera un nuevo cambio oculto para el usuario con el valor guardado en la SESSION.
Después, para saber si el formulario es de un usuario, cuando lo verifiquemos solamente tendremos que ver si es igual $_SESSION['invisibleCaptcha'] y $_POST['invisibleCaptcha'] (también valdría en GET) después de haber iniciado la sesión con session_start().

Espero que les sea de ayuda para poder evitar el spam sin incordiar al usuario.

No hay comentarios:

Publicar un comentario