Completely Automated Public Turing Test to Tell Computers and Humans Apart“ "Test público de Turing completamente automatizado para mantener separados los ordenadores y las personas“. Ejemplos: http://www.eugenio-soler-galan.es/julio Trabajo de investigación II (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán Profesor: Julio Cesar Hernández Castro
31
Embed
Trabajo de investigación II (Especialización Sistemas ... · Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Completely Automated Public Turing Test to Tell Computers and Humans Apart“
"Test público de Turing completamente automatizado para mantener separados los ordenadores y las personas“.
Ejemplos: http://www.eugenio-soler-galan.es/julio
Trabajo de investigación II (Especialización Sistemas Distribuidos, Multimedia y Seguros)
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
EJEMPLO 1
Lo primero que necesitamos para mostrar un CAPTCHA es crear aleatoriamente la secuencia de caracteres que va aparecer en la imagen y guardarla en una variable de sesión ($_SESSION) para comprobarla luego con la ingresada por el usuario, eso se hace en el fichero: index.php <? //Esta es la parte escrita en PHP del formulario session_start();//Inicializamos una nueva sesión, si quisieramos saber el identificador de la sesión lo podríamos hacer con session_id(), nos devuelve un número de 16 byte y hasta que no cerremos la sesion este será nuestro identificador de sesion $captcha_texto = "";//Inicializamos la variable que va a contener 6 caracteres a vacio for ($i = 1; $i <= 6; $i++)//Introducimos 6 caracteres de forma aleatoria en dicha variable $captcha_texto .= caracter_aleatorio(); $HTTP_SESSION_VARS["captcha_texto_session"] = $captcha_texto;//pasamos por variable de sesión los 6 caracteres obtenidos //Función aleatoria con la que obtendremos los caracteres function caracter_aleatorio() { mt_srand((double)microtime()*1000000);//Genera una semilla a partir del tiempo actual de la maquina en segundos con decimales hasta las micra al multiplicarlo por 10E6 obtenemos un numero entero que sirve de semilla a mt_srand. $valor_aleatorio = mt_rand(1,3);//Ahora obtenemos un número entre 1 y 3. De esta forma es tan probable obtener un caracter en minúsculas como en mayúsculas o digitos del 0 al 9 switch ($valor_aleatorio) { case 1: $valor_aleatorio = mt_rand(97, 122); //Genera letras en minúsculas break; case 2: $valor_aleatorio = mt_rand(48, 57); //Genera digitos del 0 al 9 break; case 3: $valor_aleatorio = mt_rand(65, 90); //Genera letras en mayúsculas break; } return chr($valor_aleatorio);//El caracter que devuelve la llamada a dicha función aleatoria } //fin de la función aleatoria ?> <!-- A partir de aquí lo que tenemos es el formulario que visualizamos escrito en html --> <html> <head> <title>Captcha tipo 1: ejemplo 1</title> </head>
Junio de 2007 Página 14 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
<body style="font-family: Verdana, Arial, Helvetica, sans-serif ; font-size: 12px"> <p>Captcha tipo 1: ejemplo 1</p> <hr size="1" width=250 align=left noshade="noshade" /> <!-- Hacemos la llamada a crear_imagen.php para que aparezca como imagen los 6 caracteres elejidos de forma aleatoria anteriormente --> <p align="left"><img src="crear_imagen.php?<?php echo SID; ?>" /></p> <!-- Un formulario cualquiera en html, donde solo aparece un campo tipo texto donde introducimos los caracteres que creemos están en la imagen --> <form action="verificar.php" method="POST"> <p>Por favor introduzca el codigo que ve en la imagen:</p> <p><input name="texto_ingresado" type="text" id="texto_ingresado" size="8" /> <input type="submit" name="Submit" value="OK" /></p> </form> <p><b>Nota:</b> El codigo diferencia mayuculas y minisculas</p> </body> </html> Otra parte importante es la creación de la imagen que se visualiza y que solo un ser humano debería ser capaz de interpretar. Debemos crear la imagen mostrando los caracteres creados anteriormente y guardados en la variable de sesion... Crear_imagen.php <? //1 definimos el tamaño de la imagen 150px de ancho por 40px de alto $captcha_imagen = imagecreate(150,40); //2 definimos el color negro que usaremos como fondo $color_negro = imagecolorallocate ($captcha_imagen, 0, 0, 0); //3 definimos el color blanco que usaremos como color del texto $color_blanco = imagecolorallocate ($captcha_imagen, 255, 255, 255); //4 rellena la imagen creada en el paso_1 del color definido en el paso_2, desde la posición (0,0) de dicha imagen imagefill($captcha_imagen, 0, 0, $color_negro); session_start();//Se reabre la sesión creada en index.php $captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"];//recupero los 6 caracteres generados aleatoriamente /*Dibuja el caracter transmitido mediante el array $captcha_texto en la imagen definida en el paso_1 con su esquina superior izquierda en 20, 13 y usando como fuente el tipo 4 y color de texto blanco*/ /*lo mismo para los otros 5 caracteres*/ 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); header("Content-type: image/jpeg"); imagejpeg($captcha_imagen); ?>
Junio de 2007 Página 15 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
Y por último la verificación, 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();//Continua con la misma sesión abierta anteriormente en index.php $texto_ingresado = $HTTP_POST_VARS["texto_ingresado"];//valor mandado através del formulario por el usuario $captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"];//valor real que se manda através de las variables de sesión if ($texto_ingresado == $captcha_texto) {//Si ambos coinciden "Soy un ser humano" y si no "puedo ser una máquina intentando aparentar serlo" echo "El codigo es correcto."; } else { echo "No ha escrito correctamente el codigo. Por favor intentelo de nuevo!"; } session_unset();//Elimina todas las variables de sesión session_destroy();//Elimina la sesión ?>
Junio de 2007 Página 16 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
EJEMPLO 2
Es similar al ejemplo 1, pero damos cierta aletoriedad tanto a la posición de los caracteres, como a su tamaño y color., eso se hace en el fichero: index.php <? //El formulario es identico al del ejemplo 1, solo varía el nombre 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); } ?> <html> <head> <title>Captcha tipo 2: ejemplo 1</title> </head> <body style="font-family: Verdana, Arial, Helvetica, sans-serif ; font-size: 12px"> <p>Captcha tipo 2: ejemplo 1</p> <hr size="1" width=250 align=left noshade="noshade" /> <p align="left"><img src="crear_imagen.php?<?php echo SID; ?>" /></p> <form action="verificar.php" method="POST"> <p>Por favor introduzca el codigo que ve en la imagen:</p> <p><input name="texto_ingresado" type="text" id="texto_ingresado" size="8" /> <input type="submit" name="Submit" value="OK" /></p> </form> <p><b>Nota:</b> El codigo diferencia mayuculas y minisculas</p> </body> </html>
Junio de 2007 Página 17 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
crear_imagen
<? //Se define esta función aleatorio ya que queremos dar mas aleatoriedad a la imagen y vamos a utilizar el código varias veces. su funcionamiento queda claramente descrito en el ejemplo1 function va($x,$y) { mt_srand((double)microtime()*1000000); $valor_aleatorio = mt_rand($x,$y); return ($valor_aleatorio); } //1 definimos el tamaño de la imagen 225px de ancho por 60px de alto $captcha_imagen=imagecreate(225,60); //2 definimos el color del fondo pero esta vez de forma aleatoria $x=va(128,255);//cantidad de rojo con una intensidad entre 128 y 255. $y=va(128,255);//cantidad de verde con una intensidad entre 128 y 255. $z=va(128,255);//cantidad de azul con una intensidad entre 128 y 255. $color_fondo = imagecolorallocate ($captcha_imagen,$x,$y,$z);//aquí es donde se crea el color del fondo //3 definimos el color del texto basandonos en el color del fondo para que haya contraste if ($x>127) $x=0; else $x=255; if ($y<=127) $y=$y+128; else $y=$y-128; if ($z<=127) $z=$z+128; else $z=$z-128; $color_texto = imagecolorallocate ($captcha_imagen,$x,$y,$z);//aquí es donde se crea el color del texto //4 rellena la imagen creada en el punto_1 con el color de fondo definido en el punto_2, desde la posición (0,0) de dicha imagen imagefill($captcha_imagen, 0, 0, $color_fondo); //5 creamos un rectangulo a una distancia del 10 puntos del borde para que quede mas difuso el texto imagerectangle ($captcha_imagen, 10, 10, 215, 50, $color_texto); //6 creamos un poligono irregular de 4 lados elegidos de forma aleatoria para que quede mas difuso el texto $esquinas=array(va(0,225),va(0,60),va(0,225),va(0,60),va(0,225),va(0,60),va(0,225),va(0,60),va(0,225),va(0,60)); imagepolygon ($captcha_imagen, $esquinas, 4, $color_texto); //7 recuperamos la sesión que abrimos en index.php session_start();
Junio de 2007 Página 18 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
//8 recuperamos el texto que queremos representar en dicha imagen $captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"]; /*9 Situamos en la imagen, con un tamaño entre 15 y 22 puntos y una rotación de entre -30º y 30º en el intervalo [23,37] la primera letra en cuanto a la distancia horizontal y en el intervalo [25,45] en cuanto a la distancia vertical, con el color del texto previamente elejido, con la fuente /fuentes/11.ttf (que también cabría la posibilidad de que fuese elejida aleatoriamente. el caracter que hemos pasado atraves de la variable de sesión */ Imagettftext($captcha_imagen, va(15,22), va(-30,30), 30+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[0]); //10 Lo mismo se hace para el resto de los caracteres, lo único que varia es el intervalo horizontal. Imagettftext($captcha_imagen, va(15,22), va(-30,30), 60+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[1]); Imagettftext($captcha_imagen, va(15,22), va(-30,30), 90+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[2]); Imagettftext($captcha_imagen, va(15,22), va(-30,30), 120+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[3]); Imagettftext($captcha_imagen, va(15,22), va(-30,30), 150+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[4]); Imagettftext($captcha_imagen, va(15,22), va(-30,30), 180+va(-7,7), 35+va(-10,10), $color_texto,"./fuentes/11.ttf", $captcha_texto[5]); header("Content-type: image/jpeg"); imagejpeg($captcha_imagen); ?>
Verificar
<? //Es identico al ejemplo de captcha tipo 1. session_start(); $texto_ingresado = $HTTP_POST_VARS["texto_ingresado"]; $captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"]; if ($texto_ingresado == $captcha_texto) { echo "El codigo es correcto."; } else { echo "No ha escrito correctamente el codigo. Por favor intentelo de nuevo!"; } session_unset(); session_destroy(); ?>
Junio de 2007 Página 19 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
EJEMPLO 3
En este ejemplo lo que vamos a utilizar son diferentes tipos de sucesiones, cuantos más tipos mejor, en este caso tenemos cuatro tipos, sucesiones aritméticas, geométricas, de días de la semana (aritméticas) y meses (aritméticas)
index.php
<? //Esta es la parte escrita en PHP del formulario session_start();//Inicializamos una nueva sesión, si quisieramos saber el identificador de la sesión lo podríamos hacer con session_id(), nos devuelve un número de 16 byte y hasta que no cerremos la sesion este será nuestro identificador de sesion function aleatorio($linferior,$lsuperior)//Función aleatoria con la que obtendremos que tipo de sucesión elejimos y los terminos de dicha sucesión. Los límites inferior y superior nos indican entre que valores se obtienen numeros aleatorios, ambos incluidos. { mt_srand((double)microtime()*1000000);//Genera una semilla a partir del tiempo actual de la maquina en segundos con decimales hasta las micra. Al multiplicarlo por 10E6 obtenemos un numero entero que sirve de semilla a mt_srand. $valor_aleatorio = mt_rand($linferior,$lsuperior);//Ahora obtenemos un número entre ese limite inferior y superior. return ($valor_aleatorio);//se devuelve dicho valor } //convierte un numero entre 0 y 6 en un día de la semana function convertirdia($numero) { switch ($numero) { case 0: return("lunes"); break; case 1: return("martes"); break; case 2: return("miércoles"); break; case 3: return("jueves"); break; case 4: return("viernes"); break; case 5: return("sábado"); break; case 6: return("domingo"); break; } }
Junio de 2007 Página 20 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
//convierte un número entre 0 y 11 en un mes function convertirmes($numero) { switch ($numero) { case 0: return("enero"); break; case 1: return("febrero"); break; case 2: return("marzo"); break; case 3: return("abril"); break; case 4: return("mayo"); break; case 5: return("junio"); break; case 6: return("julio"); break; case 7: return("agosto"); break; case 8: return("septiembre"); break; case 9: return("octubre"); break; case 10: return("noviembre"); break; case 11: return("diciembre"); break; } } //tipo de secuencia lógica. Cuantas mas secuencias lógicas mas dificultad. switch (aleatorio(1,4)) { case 1: //lineal-El primer término está entre -79 y 79 y el incremento entre -10 y 10 $termino[0]=aleatorio(-79,79); $t[0]=strval($termino[0]); $incr=aleatorio(-10,10); for ($i = 1; $i <= 3; $i++)
Junio de 2007 Página 21 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
{ $termino[$i]=$termino[$i-1]+$incr; $t[$i]=strval($termino[$i]); } break; case 2: //geometrica-El primer término está entre -10 y 10 y la razon entre -4 y 4, excluyendo el 0 $termino[0]=aleatorio(-10,10); $t[0]=strval($termino[0]); $incr=aleatorio(1,4); if (aleatorio(0,1)==0) $incr=-$incr; for ($i = 1; $i <= 3; $i++) { $termino[$i]=$termino[$i-1]*$incr; $t[$i]=strval($termino[$i]); } break; case 3: //lineal z7(dias de la semana) Es un sucesión lineal cíclica. $termino[0]=aleatorio(0,6); $t[0]=convertirdia($termino[0]); $incr=aleatorio(0,6); for ($i = 1; $i <= 3; $i++) { $termino[$i]=($termino[$i-1]+$incr)%7; $t[$i]=convertirdia($termino[$i]); } break; case 4: //lineal z12(meses). Es una sucesión lineal cíclica. $termino[0]=aleatorio(0,11); $t[0]=convertirmes($termino[0]); $incr=aleatorio(0,11); for ($i = 1; $i <= 3; $i++) { $termino[$i]=($termino[$i-1]+$incr)%12; $t[$i]=convertirmes($termino[$i]); } break; } $HTTP_SESSION_VARS["captcha_texto_session"] = $t; ?> <!-- A partir de aquí lo que tenemos es el formulario que visualizamos escrito en html --> <!-- Para saber más, ver Captcha tipo 1: ejemplo 1 --> <html> <head> <title>Captcha tipo 3: ejemplo 1</title> </head> <body style="font-family: Verdana, Arial, Helvetica, sans-serif ; font-size: 12px"> <p>Captcha tipo 3: ejemplo 1</p> <hr size="1" width=250 align=left noshade="noshade" /> <p align="left"><img src="crear_imagen.php?<?php echo SID; ?>" /></p> <form action="verificar.php" method="POST">
Junio de 2007 Página 22 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
<p>Por favor introduzca el siguiente termino de la sucesión:</p> <p><input name="texto_ingresado" type="text" id="texto_ingresado" size="11" /> <input type="submit" name="Submit" value="OK" /></p> </form> </body> </html>
crear_imagen
<? //Se define esta función aleatorio ya que queremos dar mas aleatoriedad //a la imagen y vamos a utilizar el código varias veces. //su funcionamiento queda claramente descrito en el ejemplo1 function va($x,$y) { mt_srand((double)microtime()*1000000); $valor_aleatorio = mt_rand($x,$y); return ($valor_aleatorio); } //1 recuperamos la sesión que abrimos en index.php session_start(); //2 recuperamos el texto que queremos representar en dicha imagen $t = $HTTP_SESSION_VARS["captcha_texto_session"]; //3 definimos el tamaño de la imagen 300x70(tipo=1) para números y 600x140(tipo=2) para texto if (strlen($t[0])>4) $tipo=2; else $tipo=1; $captcha_imagen=imagecreate(300*$tipo,70*$tipo); //4 definimos el color que usaremos como fondo pero esta vez de forma aleatoria $x=va(128,255);//cantidad de rojo con una intensidad entre 128 y 255. $y=va(128,255);//cantidad de verde con una intensidad entre 128 y 255. $z=va(128,255);//cantidad de azul con una intensidad entre 128 y 255. $color_fondo = imagecolorallocate ($captcha_imagen,$x,$y,$z);//aquí es donde se crea el color del fondo //5 definimos el color del texto basandonos en el color del fondo para que haya contraste if ($x<=127) $x=0; else $x=255; /* $x=$x+128; else $x=$x-128;*/ if ($y<=127) $y=$y+128; else $y=$y-128;
Junio de 2007 Página 23 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
if ($z<=127) $z=$z+128; else $z=$z-128; $color_texto = imagecolorallocate ($captcha_imagen,$x,$y,$z); //6 rellena la imagen creada en el punto_3 con el color de fondo definido en el punto_4, desde la posición (0,0) de dicha imagen imagefill($captcha_imagen, 0, 0, $color_fondo); /*7 Situamos en la imagen, con un tamaño entre 30 y 40 puntos y una rotación de entre -30º y 30º en un intervalo que va a depender del tipo y que lleva además un poco de aleatoriedad tanto en horizontal como en vertical, con el color del texto previamente elejido, con la fuente /fuentes/11.ttf (que también cabría la posibilidad de que fuese elejida aleatoriamente. el caracter que hemos pasado atraves de la variable de sesión */ Imagettftext($captcha_imagen, va(30,40), va(-30,30), 25+va(-10,10), 48*$tipo+va(-10,10), $color_texto,"./fuentes/11.ttf", trim(strval($t[0]))); //8 Lo mismo se hace para el resto, lo único que varia es el intervalo horizontal. Imagettftext($captcha_imagen, va(30,40), va(-30,30), 115*$tipo+va(-10,10), 48*$tipo+va(-10,10), $color_texto,"./fuentes/11.ttf", trim(strval($t[1]))); Imagettftext($captcha_imagen, va(30,40), va(-30,30), 205*$tipo+va(-10,10), 48*$tipo+va(-10,10), $color_texto,"./fuentes/11.ttf", trim(strval($t[2]))); header("Content-type: image/jpeg"); imagejpeg($captcha_imagen); ?>
Verificar
<? session_start();//Continua con la misma sesión abierta anteriormente en index.php $texto_ingresado = $HTTP_POST_VARS["texto_ingresado"];//valor mandado através del formulario por el usuario $t = $HTTP_SESSION_VARS["captcha_texto_session"];//valor real que se manda através de las variables de sesión if ($texto_ingresado == trim(strval($t[3]))) {//Si ambos coinciden "Soy un ser humano" y si no "puedo ser una máquina intentando aparentar serlo" echo "El codigo es correcto."; } else { echo "No ha escrito correctamente el codigo. Por favor intentelo de nuevo!"; } session_unset();//Elimina todas las variables de sesión session_destroy();//Elimina la sesión ?>
Junio de 2007 Página 24 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
EJEMPLO 4
En este ejemplo se utilizan imágenes elejidas aleatoriamente pero con algo en común, primero se elije el tipo y luego las imágenes dentro de ese tipo.
index.php
<? //Esta es la parte escrita en PHP del formulario session_start();//Inicializamos una nueva sesión, si quisieramos saber el identificador de la sesión lo podríamos hacer con session_id(), nos devuelve un número de 16 byte y hasta que no cerremos la sesion este será nuestro identificador de sesion mt_srand((double)microtime()*1000000);//Genera una semilla a partir del tiempo actual de la maquina en segundos con decimales hasta las micra. Al multiplicarlo por 10E6 obtenemos un numero entero que sirve de semilla a mt_srand. $tipo=trim(strval(mt_rand(1,16)));//elejimos el tipo de foto al azar, entre 1 y 16. $imagen="";//inicializamos a vacio la variable imagen para ir guardando después las cuatro imagenes que se van a mostrar $i=1;//Vamos a seleccionar dentro de este tipo 4 fotos de entre las 8 posibles. while($i<=4) { $fotoaux=mt_rand(1,8); $contaaux=1; $existe=0; while (($contaaux<$i)&&($encontrado==0)) { if ($fotoaux==$foto[$contaaux]) $encontrado=1; else $contaaux=$contaaux+1; } if ($encontrado==0) { $foto[$i]=$fotoaux; $imagen.=str_pad($tipo,2,"0",STR_PAD_LEFT).str_pad(trim(strval($foto[$i])),2,"0",STR_PAD_LEFT); $i=$i+1; } else $encontrado=0; } //guardado en esta variable de sesión el nombre de los archivos que contienen la imagen $HTTP_SESSION_VARS["captcha_texto_session"] = $imagen; ?> <html> <head> <title>Captcha tipo 4: ejemplo 1</title> </head> <body style="font-family: Verdana, Arial, Helvetica, sans-serif ; font-size: 12px">
Junio de 2007 Página 25 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
<p>Captcha tipo 4: ejemplo 1</p> <hr size="1" width=250 align=left noshade="noshade" /> <!-- La única diferencia con los index de los ejemplos de tipo 1, 2 y 3. Es que en esta ocasión tenemos que crear cuatro imagenes diferentes por lo que hacemos cuatro llamadas diferentes, aunque el código de crear_imagenX.php es casi igual salvo en la imagen en la que se tienen que fijar en caqa caso. --> <table> <tr> <td><img src="crear_imagen1.php?<?php echo SID; ?>"></td> <td><img src="crear_imagen2.php?<?php echo SID; ?>"></td> </tr> <tr> <td><img src="crear_imagen3.php?<?php echo SID; ?>"></td> <td><img src="crear_imagen4.php?<?php echo SID; ?>"></td> </tr> </table> <form action="verificar.php" method="POST"> <!-- Aquí están los tipos de las imagenes que se pueden seleccionar --> <p>Por favor introduzca la palabra que representa las imagenes:</p> <p> <SELECT NAME="texto_ingresado"> <OPTION>amor <OPTION>arbol <OPTION>balon <OPTION>banco <OPTION>barco <OPTION>bota <OPTION>casa <OPTION>dinosaurios <OPTION>isla <OPTION>matematicas <OPTION>moneda <OPTION>oveja <OPTION>pajaro <OPTION>radio <OPTION>raqueta <OPTION>risa </SELECT> <input type="submit" name="submit" value="OK" /></p> </form> </body> </html>
crear_imagen1
<? Header("Content-type: image/jpeg"); session_start();//continuamos la sesión abierta en index.php $fichero = $HTTP_SESSION_VARS["captcha_texto_session"];//recuperamos el nombre de las imagenes. Donde $fichero[0].$fichero[1] es el tipo y $fichero[2].$fichero[3] es la imagen dentro de ese tipo $nueva1=imagecreatefromjpeg("imagenes/".$fichero[0].$fichero[1].$fichero[2].$fichero[3].".jpg");
Junio de 2007 Página 26 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
imagejpeg($nueva1);//creamos una imagen jpg con una calidad del 75%(por defecto) y no se cree guarda en ningún archivo. Imagedestroy($nueva1);//se libera la memoría utilizada en la creación de la imagen. ?>
crear_imagen2
<? Header("Content-type: image/jpeg"); session_start();//continuamos la sesión abierta en index.php $fichero = $HTTP_SESSION_VARS["captcha_texto_session"];//recuperamos el nombre de las imagenes. Donde $fichero[4].$fichero[5] es el tipo y $fichero[6].$fichero[7] es la imagen dentro de ese tipo $nueva1=imagecreatefromjpeg("imagenes/".$fichero[4].$fichero[5].$fichero[6].$fichero[7].".jpg"); imagejpeg($nueva1);//creamos una imagen jpg con una calidad del 75%(por defecto) y no se cree guarda en ningún archivo. Imagedestroy($nueva1);//se libera la memoría utilizada en la creación de la imagen. ?>
crear_imagen3
<? Header("Content-type: image/jpeg"); session_start();//continuamos la sesión abierta en index.php $fichero = $HTTP_SESSION_VARS["captcha_texto_session"];//recuperamos el nombre de las imagenes. Donde $fichero[8].$fichero[9] es el tipo y $fichero[10].$fichero[11] es la imagen dentro de ese tipo $nueva1=imagecreatefromjpeg("imagenes/".$fichero[8].$fichero[9].$fichero[10].$fichero[11].".jpg"); imagejpeg($nueva1);//creamos una imagen jpg con una calidad del 75%(por defecto) y no se cree guarda en ningún archivo. Imagedestroy($nueva1);//se libera la memoría utilizada en la creación de la imagen. ?>
crear_imagen4
<? Header("Content-type: image/jpeg"); session_start();//continuamos la sesión abierta en index.php $fichero = $HTTP_SESSION_VARS["captcha_texto_session"];//recuperamos el nombre de las imagenes. Donde $fichero[12].$fichero[13] es el tipo y $fichero[14].$fichero[15] es la imagen dentro de ese tipo $nueva1=imagecreatefromjpeg("imagenes/".$fichero[12].$fichero[13].$fichero[14].$fichero[15].".jpg"); imagejpeg($nueva1);//creamos una imagen jpg con una calidad del 75%(por defecto) y no se cree guarda en ningún archivo. Imagedestroy($nueva1);//se libera la memoría utilizada en la creación de la imagen. ?>
Verificar
<? session_start();//Continua con la misma sesión abierta anteriormente en index.php $texto_ingresado = $HTTP_POST_VARS["texto_ingresado"];//valor mandado através del
Junio de 2007 Página 27 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
formulario por el usuario $captcha_texto = $HTTP_SESSION_VARS["captcha_texto_session"];//valor real que se manda através de las variables de sesión //en el siguiente switch cada case es un tipo, y luego solo comprobamos si coincide el valor mandado através del formulario con el valor real switch ((int)$captcha_texto[0].$captcha_texto[1]) { case 1://Si ambos coinciden "Se es un ser humano" y si no "puede ser una máquina intentando aparentar serlo" if ($texto_ingresado=="amor") $correcto=1; else { $correcto=0; } break; case 2: if ($texto_ingresado=="arbol") $correcto=1; else { $correcto=0; } break; case 3: if ($texto_ingresado=="balon") $correcto=1; else { $correcto=0; } break; case 4: if ($texto_ingresado=="banco") $correcto=1; else { $correcto=0; } break; case 5: if ($texto_ingresado=="barco") $correcto=1; else { $correcto=0; } break; case 6: if ($texto_ingresado=="bota") $correcto=1; else { $correcto=0; } break; case 7: if ($texto_ingresado=="casa") $correcto=1; else {
Junio de 2007 Página 28 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
$correcto=0; } break; case 8: if ($texto_ingresado=="dinosaurios") $correcto=1; else { $correcto=0; } break; case 9: if ($texto_ingresado=="isla") $correcto=1; else { $correcto=0; } break; case 10: if ($texto_ingresado=="matematicas") $correcto=1; else { $correcto=0; } break; case 11: if ($texto_ingresado=="moneda") $correcto=1; else { $correcto=0; } break; case 12: if ($texto_ingresado=="oveja") $correcto=1; else { $correcto=0; } break; case 13: if ($texto_ingresado=="pajaro") $correcto=1; else { $correcto=0; } break; case 14: if ($texto_ingresado=="raqueta") $correcto=1; else { $correcto=0; } break; case 15: if ($texto_ingresado=="risa") $correcto=1;
Junio de 2007 Página 29 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
else { $correcto=0; } break; case 16: if ($texto_ingresado=="radio") $correcto=1; else { $correcto=0; } break; } if ($correcto==1) echo "El codigo es correcto."; else { echo "No ha escrito correctamente el codigo. Por favor intentelo de nuevo!"; } session_unset();//Elimina todas las variables de sesión session_destroy();//Elimina la sesión ?>
Junio de 2007 Página 30 de 31
Trabajo de investigación Trabajo de investigación II CAPTCHA (Especialización Sistemas Distribuidos, Multimedia y Seguros) Autor: Eugenio Soler Galán
BIBLIOGRAFÍA
Los Captchas: prevención de los abusos en Internet Autor: Francisco Monteagudo (Servitec.com) http://www.camaravalencia.com/colecciondirectivos/leerArticulo.asp?intArticulo=1870
Captcha net http://www.captcha.net
El gurú del programador http://www.elguruprogramador.com.ar/articulos/captcha-diferenciando-automaticamente-humanos-de-maquinas-con-php.htm