Escrito por Mauro Rondinelli el Miércoles 08 de Marzo de 2006 a las 00:00hs
Los CAPTCHA o 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) son aquellas imagen con caracteres que aparecen en los formularios para detectar cuando el formulario es llenado por un humano o por un bot (programa especial para automatizar procesos).
Veamos un ejemplo de CAPTCHA...

Tipico CAPTCHA usado por Google
El Formulario
Lo primero que necesitamos para mostrar un CAPTCHA es crear aleatoreamente la secuencia de caracteres que va aparecer en la imagen y guardarla en una variable de session ($_SESSION) para comprobarla luego con la ingresada por el usuario...
<?
session_start();
$captcha_texto = "";
for ($i = 1; $i <= 6; $i++) {
$captcha_texto .= caracter_aleatorio();
}
$HTTP_SESSION_VARS["captcha_texto_session"] = $captcha_texto;
function caracter_aleatorio() {
mt_srand((double)microtime()*1000000);
$valor_aleatorio = mt_rand(1,3);
switch ($valor_aleatorio) {
case 1:
$valor_aleatorio = mt_rand(97, 122);
break;
case 2:
$valor_aleatorio = mt_rand(48, 57);
break;
case 3:
$valor_aleatorio = mt_rand(65, 90);
break;
}
return chr($valor_aleatorio);
}
?>
Luego insertamos el formulario...
<p>Captcha: Formularios mas seguros.</p>
<hr size="1" noshade="noshade" />
<p>Por favor ingrese el codigo que ve en la imagen, sino puede leerlo actualize la pagina.</p>
<p align="center"><img src="crear_imagen.php?<?php echo SID; ?>" /></p>
<form action="verificar.php" method="POST">
<p>Ingrese el codigo:
<input name="texto_ingresado" type="text" id="texto_ingresado" size="30" />
<input type="submit" name="Submit" value="OK" />
</p>
</form>
<p
><b>Nota:</b> El codigo es sensible a las mayusculas y minisculas</p>
Notemos el código en negrita, la forma de llamar a la imagen es "dinámica" osea no estamos llamando directamente a la imagen sino que llamamos a un script php que crea la imagen dinámicamente basandose en la secuencia de caracteres creada anteriormente.
La imagen
Ahora en el archivo "crear_imagen.php" debemos crear la imagen mostrando los caracteres creados anteriormente y guardados en una variable de session...
<?
//creamos la imagen definiendo el tamaño del alto y el ancho (150, 40)
$captcha_imagen = imagecreate(150,40);
//creamos el color negro para el fondo y blanco para los caracteres
$color_negro = imagecolorallocate ($captcha_imagen, 0, 0, 0);
$color_blanco = imagecolorallocate ($captcha_imagen, 255, 255, 255);
//pintamos el fondo con el cplor negro creado anteriormente
imagefill($captcha_imagen, 0, 0, $color_negro);
//iniciamos la session para obtener los caracteres a dibujar
session_start();
$captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"];
//dibujamos los caracteres de color blanco
imagechar($captcha_imagen, 4, 20, 13, $captcha_texto[0] ,$color_blanco);
imagechar($captcha_imagen, 5, 40, 13, $captcha_texto[1] ,$color_blanco);
imagechar($captcha_imagen, 3, 60, 13, $captcha_texto[2] ,$color_blanco);
imagechar($captcha_imagen, 4, 80, 13, $captcha_texto[3] ,$color_blanco);
imagechar($captcha_imagen, 5, 100, 13, $captcha_texto[4] ,$color_blanco);
imagechar($captcha_imagen, 3, 120, 13, $captcha_texto[5] ,$color_blanco);
//indicamos que lo que vamos a mostrar es una imagen
header("Content-type: image/jpeg");
//mostramos la imagen
imagejpeg($captcha_imagen);
?>
Ya creamos el formulario con la imagen el aspecto los vemos en la siguiente imagen...

Verificar
Ahora lo que nos queda por delante es verificar que el código ingresado por el usuario coincida con el CAPTCHA creado, esto lo hacemos en el archivo "verificar.php"...
<?
session_start();
$texto_ingresado = $HTTP_POST_VARS["texto_ingresado"];
$captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"];
if ($texto_ingresado == $captcha_texto) {
echo "Usted ingreso el codigo correctamente.";
} else {
echo "El texto ingresado no coincide. Por favor intentelo de nuevo!";
}
session_unset();
session_destroy();
?>
Pueden descargar el codigo en php funcionando desde aqui.
Muy interesante, me sirvió bastante para un trabajo que requería mayores características de seguridad. Sin embargo, como yo trabajo PHP con AJAX, mi adaptación no usa sesiones (de hecho no inicia la sesión sino hasta que el sistema verifica al usuario).
Gracias por todo y sigan ilustrándonos con sus artículos.
FUNCIONA PERFECTAMENTE Y ESTA MUY BIEN EXPLICADO,
MUCHAS GRACIAS
APRENDÍ MUCHAS COSAS!!!
hola...
podrian ayudarme porfavor..lo q pasa es q no genera la imagen, es devir, solo me muestra el cuadro con una X alguin me podria decir xq...porfavor se los agredeceria mucho
descargue el codigo y los coloque en el sitio, por mas que ingrese los caracteres, respetando las mayusculas y minusculas, siempre me dice que lo ingrese mal.... donde esta el error... gracias!!!
Según el artículo:
Pero en el caso de que este formulario ya tenga una Acción tipo:
Para incorporar el captcha ¿qué se ha de hacer? ¿qué se ha de poner en "Acción" para que procese el formulario a la vez que procesa el captcha?
Gracias
Funciona a la perfecion, muchisimas gracias, solo un consejo a los que como yo les de el error de :
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at....
fue por integrar el codogo tal cual en una pagina ya creada y habia colocado el codigo del formulario para crear la sesion abajo del contenido que queria que la gente comentarara de dicha pagina, con lo cual me daba el fallo mencionado, asi que coloqué el codigo para crear la sesion al principio de la pagina por que tengo entendido que las sesiones se tienen que colocar simpre al principio de cada pagina, y más abajo del contenido de la pagina que quiero que comente la gente el formulario con el capcha y funciona correctamente, en fin soy un poco novato en esto de php pero espero que les aclare si les sale el mismo error que me salio a mi, ahora funciona genial.
Hola muchas gracias por ese codigo esta estupendo , quiero pedir un favor si alguien tiene un codigo para adjuntar archivos en un formulario tengo uno pero no me funciono este es mi mail: servicio@solutecsi.com con gusto se los agradeceria
tengo el phpmailer.php el cual quiero modificarlo para que me adjunte el archivo gracias.
Muy buen sistema! grax!
hOLA, Muchas gracias por el código. Pero... como tendría que hacer o que código es para un formulario que es en Html ? El formulario esta compuesto por tres archivos. uno se lllama Formulario.html , global.inc.php y process.php
Cual es al que tengo que modificar? y cual es el codigo CAPTCHA para este o estos?
Mil gracias.
Disculpas, creo que agregue mal el código, lo pueden ver en:
http://searchall.iwebland.com/files/mail.php
Lo que deseo es agregarle un captcha este formulario, es posible?
Muchas gracias de antemano
Hola: Muy bien explicado el tutorial.
Una consulta:
¿Cómo se podria distorcionar o girar unos grados los caracteres del código?
Y ¿Cómo agregarle unas lineas y un poco de ruido al fondo de la imagen?
Sería interesante para complicárselo un poco más a los spammers.
Hola.
Esta muy bueno. Pero tengo un problema.
En el mail que envia, tambien me envia esto:
texto_ingresado = f4ts
SEND = Enviar
Alguna idea de como solventarlo?
Ojo, yo conbien el formulario y tu codigo de un formulario que ya tenia hecho.
GRacias.
Tengo un Guestbook en php que no lo puedo integrar con este captcha...
en el echo del archivo verificar de el captcha, sale fuera del archivo php del formulario y no guarda la informacion q esta escrita en el php.
Animal!, aprende a escribir!!!!! " son aquellas imagen con caracteres " seria " son aquellas imagenes con caracteres",
y vos sos el guru?