Sencillo sistema AntiBot en PHP con preguntas

1 de Octubre del 2007 Escrito por Alex Barros

Seguramente ya conoceréis el clásico sistema Anti Robots que consiste en hacer una pregunta que requiera del “razonamiento humano“. Este sistema puede ser construido de una forma sencillísima con PHP, y os muestro cómo:

Nuestra base de datos de preguntas y respuestas será un simple array. Además usaremos las sesiones, para verificar la respuesta en el archivo de chequeo.

El array de preguntas y respuestas contendrá una pregunta clara y legible para los humanos, y una respuesta a modo de expresión regular, para considerar las variantes de respuesta. Por ejemplo:

Pregunta: ¿Cuántos dedos tiene una mano?
Respuesta: (5|cinco) // acepta mayúsculas y minúsculas

Una vez declarado esto, seleccionaremos una pregunta al azar, con la función rand(). La parte de pregunta la imprimiremos por pantalla en el lugar adecuado junto a un campo de texto.

Lo siguiente es guardar la expresión regular que contiene la respuesta en una variable de sesión, para que quede accesible en el chequeo a continuación.

Por último, en el archivo de chequeo usaremos la función de que evalua expresiones regulares eregi(), sometiendo la respuesta del campo de texto a la expresión regular almacenada en sesión.

El concepto ya está definido, y es tan simple como eso. Ahora plasmémoslo en esas bonitas letras de colores que son el código:

En el archivo del formulario:

  1. session_start(); //Al principio del todo!!!
  2. $preguntas = array();
  3. $preguntas[] = array(‘Cuantos dedos tiene una mano?’,‘(5|cinco)’);
  4. $preguntas[] = array(‘Resultado de sumar 2 y 4?’,‘(6|seis)’);
  5. $preguntas[] = array(‘Cuantas ruedas tiene un coche?’,‘(4|cuatro)’);
  6. $preguntas[] = array(‘Que animal es mas grande: elefante o caracol?’,‘(primero|elefante)’);
  7. $preguntas[] = array(‘Cual es el color mas oscuro de todos?’,‘negro’);
  8. $preguntas[] = array(‘Por favor, contesta: eres humano?’,‘(si|claro)’);
  9. $preguntas[] = array(‘Con que mano escribe un zurdo?’,‘(izquierda)’);
  10. $preguntas[] = array(‘Escribe pan dos veces.’,‘^pan ?pan$’);
  11. // puedes escribir todas las que quieras
  12.  
  13. $pregn = rand(0,(count($preguntas)-1)); // numero al azar
  14. $_SESSION[‘pregregex’] = $preguntas[$pregn][1]; // Lo guardo en sesion
  15. echo ‘</p>’.$preguntas[$pregn][0].‘</p><br><input type="text" name="respuesta" />’;

Y en el archivo de chequeo:

  1.  
  2. if($_SESSION[‘pregregex’] AND $_GET[‘respuesta’])
  3. {
  4.         if(eregi($_SESSION[‘pregregex’],$_GET[‘respuesta’]))
  5.         echo "De acuerdo, no eres un robot…";
  6.         else
  7.         echo "Solo Bender puede superarte a robot !";
  8.         unset($_SESSION[‘pregregex’]);
  9. }

Inconvenientes:

  • El idioma importa (a no ser que sean preguntas aritmeticas)
  • Puedes toparte con una mente brillante, que le de por contestarte lo que no es
  • …ninguno más, que yo sepa… pregúntale a un robot.

Podéis probar su funcionamiento en directo desde este ejemplo.

Descargar ejemplo:
anti-bot.zip

Categorias: Aplicaciones, Código, HOWTO/CóMO, PHP, Seguridad, Software libre |

Hay 5 comentarios, pero nos falta el tuyo

Alejandro Torres Ha dicho:

Muy bueno, me parece una gran medida para evitar el SPAM y sin molestos captchas :-D

Alex Barros Ha dicho:

Pues sí, yo opino que son los nuevos captchas. Los visuales muchas veces son tan indescifrables…

VULCAN Ha dicho:

ME PARECE UN MUY BUEN CODIGO VOY A REALIZARLE UNAS PEQUEÑAS MODIFICACIONES HABER COMO ME VA… GRACIAS

ADIOS….

José Cabo Ha dicho:

Hola Vulgan, gracias por comentar en el post de Alex.

A ambos nos gustaría que los usuarios escribieran siempre en minúsculas puesto que en internet, al leer, palabras escritas en mayúscula es sinónimo de hablar gritando.

¡Gracias y hasta la próxima!

Innovacionweb.com Ha dicho:

Muy bueno vuestro artículo, he desarrollado algo similar.

http://www.innovacionweb.com/anti-spam-accesible-preguntas-php.php

Un saludo.

del.icio.us meneame.net RSS

Buscar:



Tagcloud

Entradas Recientes

Meta: