Captcha: Diferenciando automaticamente humanos de maquinas con PHP

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...

Captcha: Formularios mas seguros.




Por favor ingrese el codigo que ve en la imagen, sino puede leerlo actualize la pagina.




Ingrese el codigo:




>Nota: El codigo es sensible a las mayusculas y minisculas



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.


comentarios



  1. 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.



  2. FUNCIONA PERFECTAMENTE Y ESTA MUY BIEN EXPLICADO,

    MUCHAS GRACIAS

    APREND? MUCHAS COSAS!!!



  3. 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



  4. 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!!!



  5. 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



  6. 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.



  7. 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: con gusto se los agradeceria
    tengo el phpmailer.php el cual quiero modificarlo para que me adjunte el archivo gracias.



  8. Muy buen sistema! grax!



  9. 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.



  10. 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



  11. 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.



  12. 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.



  13. 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.



  14. Animal!, aprende a escribir!!!!! " son aquellas imagen con caracteres " seria " son aquellas imagenes con caracteres",


    y vos sos el guru?



  15. hola saben agrege el archivo, lo modifique y todo funciona casi a la perfeccion el problema que tengo es el siguiente , klo puse dentro de una iframe y no me resulta ya que cuando comparo la imagene en el verificar cambia osea cambia constantemente, no puedo verificar bien , y cuando hago que sea solo en una hoja sin iframe me compara bien y coicide el tecto ingresado con la imagen , pero en algunas ocaciones se descomppone,, porfa si me entienden y me pueden ayudar



  16. He probado el programa y funciona muy bien pero queria preguntarle ¿Cómo hago para que en el lugar que me dice que el código está introducido correctamente me dirija a la página donde está el verdadero formulario que deseo proteger con su script?



  17. Justo lo que buscaba, hasta ahora tengo montado el rechaptcha pero en la mitad de las veces no tienes ni idea de lo que pone y es un coñazo para los usuarios. En cuanto pueda monto esta opción.



  18. hola:

    Yo debo de ser la mas torpe del mundo¡¡¡

    He probado a instalarlo, pero la imagen del formulario ( y la generada) me sale el fondo negro, pero no los caracteres que se han de escribir, alguna idea de que puede pasar?

    un saludo



  19. Hola. Funciona excelente ! Muchas gracias.
    ¿Hay alguna forma de que se actualice sólo la imagen?
    ¿Podemos darle un tamaño un poco mayor a la letra?
    Muchisimas gracias. Continuén así !!!

agregar comentario


Se permiten las etiquetas HTML , y

. Si ingresa alguna direcci?n web o direcci?n de email ser?n convertidos en enlaces autom?ticamente.





publicidad

API DE FACEBOOK
GOOGLE CALENDAR API
GOOGLE MAPS API