Burdjia

Cómo hacer un sistema CAPTCHA propio

Mis dos webs tienen sendos formularios con los cuales cualquiera puede enviarme un mensaje.  El funcionamiento es muy sencillo:  cuando el servidor recibe el mensaje, comprueba que contiene todos los datos y que hay un correo correctamente indicado, y acto seguido me envía un mensaje con todo.  Pero claro, fue poner en marcha estos formularios y empecé a recibir SPAM.  Bueno, inicialmente recibí varios intentos de juankeo (estoy seguro de haber escrito algo sobre dar las gracias a los piratas turcos por poner a prueba la web, pero ahora no lo encuentro), el SPAM tardó un poquito en llegar, pero llegó.

La solución de añadir un CAPTCHA la barajé desde el principio, pero no me apetecía tener que meter una biblioteca de terceros ya que podía complicar las cosas.  No uso un framework al uso ni ninguna biblioteca extra, así que tendría que instalarlo y configurarlo y hacer pruebas y… paso.

Pero hace cosa de un mes hice un trámite para la TSS y me encontré con un sistema a priori muy simple pero ingenioso.  La página te presenta una lista de palabras y tienes que escribir en un campo aquella que pertenece a una categoría concreta.  Esto me recordó, también, a la pregunta de seguridad de la wiki de Free Pascal, la cual pregunta por el resultado de ejecutar una instrucción Pascal.  Así que me decidí, finalmente, a programarlo.

Cómo funciona

Primero, tenemos una tabla con dos campos:  Palabras y Categorías.  Cada palabra tiene una única categoría y no debe haber ambigüedades, lo cual limita un poco el número de palabras pero facilita las cosas luego.

Cuando se genera el formulario, se selecciona una palabra de forma aleatoriamente, que será la respuesta.  Luego se seleccionan otras tres que pertenezcan a una categoría distinta a la seleccionada.  A continuación creo un código hash combinando la palabra de respuesta con la fecha POSIX para tenerla con referencia y almaceno la palabra de respuesta junto con el hash y la fecha.  Finalmente se genera el formulario mostrando todas las palabras, desordenadas, y la pregunta, con el hash en un campo oculto.

Cuando se recibe el formulario, se eliminan del almacén todas las respuestas viejas para que no se acumulen y se comprueba si la respuesta enviada es correcta.  Si no lo es, se genera otro hash diferente.

Podéis probarlo vosotros mismos.

El resultado

Sé que el sistema no es perfecto, y seguramente que algún bot sería capaz de romperlo con facilidad, sin embargo desde que está activo he dejado de recibir SPAM.  ¿Por cuánto tiempo?  Pues no lo sé.

De todas formas me parece bastante absurdo que me envíen SPAM cuando es más que evidente que tiene un retorno del 0%.  Incluso cuando lo recibía, no lo leía, porque era fácilmente identificable: en el asunto se limitaban a poner una cadena de caracteres aleatoria.

En conclusión, ha sido muy fácil quitarse esta molestia de encima, así que si tienes este problema de SPAM no quites el formulario, símplemente añade un CAPTCHA, aunque sea simple como el mío, y asunto arreglado.

Etiquetas: Seguridad

Categorías: Artículos, Mantenimiento web, Programación, Web

Entradas relacionadas:

  • Rescatando Gesbit
  • Chovinismo informático
  • Mejorando la sal en la protección de datos
  • Allegro.pas 5.0 alpha 1
  • Evaluación Momen 3D
  • Escribe tu comentario

    HTML permitido: cite, code, dd, dl, dt, em, li, ol, p, q, small, strong, ul