Utilización de captcha para aumentar la seguridad en los formularios de Opencms

22/05/2009       Sergio Raposo Vargas       Manuales y tutoriales

captcha
El componente CAPTCHA está pensado para impedir que un robot (programa generador por un usuario mal intencionado) se aproveche de un formulario web para el envío masivo de mensajes o solicitudes:
  • formulario de comentarios
  • funcionalidad de envío por e-mail
  • votaciones en encuestas
  • reporte de abuso
  • ingresos de ‘posts’ en un foro o blog
  • etc.

El presente artículo, presenta una visión de alto nivel sobre como implementar esta tecnología para impedir que un sitio sea víctima de un robot.

 

Cómo funciona un formulario Web estándar?

Un formulario web está formado por un conjunto de campos que se envían una dirección URL específica. El navegador es quién muestra el formulario, permite la carga de información y permite el envío de los datos. En la URL de destino se procesan los datos recibidos y se realiza un procesamiento de acuerdo a lo que específica la aplicación.

Cómo funcionan los robots?

Un robot programado por lo general toma el papel del navegador y genera el formulario cargando datos específicos que envía a la URL de proceso. De esa forma puede lograr en un lapso breve de tiempo un ingreso y proceso vulnerando el sitio Web.

Para evitar esto, se creó un método conocido como CAPTCHA. El mismo, agrega en el formulario una imagen conformada por letras con cierta distorsión. Estas letras solo pueden ser interpretadas por un ser humano y no por un robot. Para la utilización del formulario con CAPTCHA el usuario debe ingresar los datos del formulario y las letras que se le muestra en la imagen.

Cómo funciona el mecanismo CAPTCHA?

Cada vez que se ingresa al formulario se genera en forma aleatoria una imagen con distintas letras y una clave propia que identifica esa imagen con su valor de texto. Esta clave y texto se guarda en el servidor.
Cuando el servidor recibe el envío del formulario verifica que el valor ingresado en el campo captcha coincida con el almacenado en el servidor para la clave utilizada. Cuando hay coincidencia se permite el procesamiento normal. De lo contrario, se lo impide.

Es importante aclarar que una vez utilizado el par de claves y valor el mismo se marca como utilizada. De esta forma, su uso es denegado si se quiere enviar el mismo formulario con el mismo par valor-clave.

Cómo agregar CAPTCHA a un sitio?

Para agregar captcha a un sitio Opencms se pueden usar implementaciones existentes. En la práctica, nosotros hemos utilizado JCAPTCHA por ser OpenSource, estar escrito en JAVA y tener un buen desempeño a nivel seguridad. La dirección del proyecto es la siguiente: http://jcaptcha.sourceforge.net/

Para su utilización en Tomcat debemos realizar los pasos descriptos a continuación. Muchos de los comportamientos requeridos son provistos por JCAPTCHA pero se presentan de todas formas para mejorar la compresión del funcionamiento.

1. Generar una clase en JAVA que implemente un servicio (servlet) que en base al framework genera el captcha.

La clase debe generar la imagen y registrar para una clave (que puede recibir por parámetro) el valor que contendrá el CAPTCHA.

2. Generar la clase en JAVA que verifique dado la clave y el valor si se corresponden y si fue utilizado. Luego de la consulta el clave-valor se marca como utilizado para no permitir su uso nuevamente.

3. Registrar el servlet en el web.xml de la aplicación para que responda a una URL.

4.  En el formulario a utilizar el mecanismo CAPTCHA:
- Generar una clave aleatoria (random). 
- Agregar al llamado al servlet dentro  de una imagen (img) pasándolo como querystring la clave.
- Guardar la clave en un campo oculto (hidden).
- Agregar un campo para que el usuario escriba las letras que ve en la imagen.

5.  Al momento de verificar el formulario obtener la clave y el valor que escribió el usuario. Utilizar la clase de verificación y ver si coincide con el almacenado en el servidor. En caso de no corresponderse, no permitir continuar con la ejecución del formulario.

Para más información, ver:
http://forge.octo.com/jcaptcha/confluence/display/general/5+minutes+application+integration+tutorial