Generando Captchas con PHP

Captcha es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart (Prueba de Turing pública y automática para diferenciar a máquinas y humanos).

Se trata de una prueba desafío-respuesta utilizada en computación para determinar cuándo el usuario es o no humano. Como el test es controlado por una máquina en lugar de un humano como en la prueba de turing, también se denomina Prueba de Turing inversa.

Clase Captcha

Esta es una clase que hice para www.lamarchaperonista.com.ar que genera captchas usando fuentes True Type (.ttf). La clase tiene varios métodos para personalizar el captcha, generar el código y seteralo en una variable de sesión de PHP.

La forma de usarla es realmente simple. Sólo hay que crear un script que contenga la clase y devuelva el captcha. Este mismo script será el encargado de generar el código y guardarlo en una variable de sesión:

// File: getCaptcha.php
requiere_once('Capcha.php');
session_start();

// Creo un captcha de 150 x 50 px
$captcha = new Captcha(150, 50);

// Creo y seteo en $_SESSION el código de 4 caracteres
$captcha->setSessionVar(4);

// Seteo la fuente TTF a usar
if ($captcha->setFontFile('ArsleGothic.ttf')) {

   // Seteo el tamaño de la tipografía
   $captcha->setFontSize(24);

   // El color
   $captcha->setFontColorWeb('716052');

   // Envío la imagen
   $captcha->sendCaptcha();

}

Al ser llamado desde otra página (como esta), mediante

<img scr="getCapcha.php"/>

, el script generará un captcha como el siguiente:

Captcha generado con la clase Captcha.php
generar nuevo

Luego, en el script que controla los datos que vienen del formulario (en el que el captcha fue mostrado), hacemos algo como esto:

// File: checkForm.php
requiere_once('Capcha.php');
session_start();

// Creo una instancia de Captcha, pero sin pasarle parámetros,
// ya que no voy a generar ninguna imagen.
$captcha = new Captcha();

// Traigo el código del captcha (seteado en $_SESSION)
// y lo comparo con el que me vino del formulario
if ( $_POST['codeCaptcha'] == $captcha->getCode() ) {

   // lo que haré en caso de coincidir los códigos.

}
else {

   // lo que haré en caso de NO coincidir los códigos.

}

Otro ejemplo

La clase tiene varios métodos más para setear las distintas propiedades del captcha, como el color de fondo, la densidad del ruido (las lineas que aparecen detras del texto) y el color del mismo.

Captcha generado con la clase Captcha.php
generar nuevo

$captcha = new Captcha(280, 70);
$captcha->setSessionVar(6);
if ($captcha->setFontFile('BagadBold.ttf')) {
   $captcha->setFontSize(32);
   $captcha->setFontColorWeb('00497B');
   $captcha->setBgColorWeb('5C9FCC');
   $captcha->setNoiseColorWeb('0069B0');
   $captcha->setNoiseFactor(70);
   $captcha->sendCaptcha();
}

Existen métodos para setear los colores pasando el código hexadecimal, ej.

setFontColorWeb("FF0033")

, y para setearlos pasando los valores por cada canal, ej.

setFontColor(255,0,51)

.

Archivos y documentación

El código junto con la documentación pueden bajarse desde aquí: Captcha.tar.gz
La documentación también puede verse en línea en http://blog.calcifer.com.ar/devel/captcha/doc
Un buen sitio para bajar fuentes TrueType es http://www.creamundo.com/

Tags: ,

Leave a Reply