NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Captchas (2 Captcha básico con php)

04 de Diciembre del 2011 por Josep Antoni Bover13066 visitas, 6 comentarios, 11 votos con una media de 4.36 sobre 5.
Categorías : PHP, JavaScript, Programación, HTML.
La web está en segundo plano, animación en pausa.
Cargando animación...
Captchas (2 Captcha básico con php)

En el tutorial anterior se vio con qué facilidad se puede sortear un captcha creado únicamente con JavaScript, y más bien fue un tutorial de cómo NO se debe hacer un captcha.

Con todo esto en mente hoy vamos a ver como podríamos crear un captcha similar al del primer tutorial pero que sea más difícil de hackear.

La parte que generara los valores aleatorios estará en el código PHP, y la parte que validara el captcha también. Además crearemos una imagen utilizando PHP con los valores a sumar, de esta forma será mucho más seguro contra hacks de JavaScript.

Solo por el simple hecho de que sea imposible saltarse la protección del captcha con un código JavaScript considero que el captcha es mucho más seguro. Aunque no nos engañemos, no existe ningún sistema de seguridad infalible, y lo repito NINGUNO.

Sobre la seguridad hay bastante que decir, si os fijáis en la mayoría de captchas comunes en la web suelen ser a base de texto incrustado en una imagen, que luego queda distorsionado con algún garabato. Los garabatos que se añaden por encima del texto se utilizan principalmente para confundir a posibles lectores de texto OCR, pero por el contrario también consiguen un efecto negativo, y es que a veces ni nosotros mismos sabemos que hay escrito allí.

Pero además la mayoría de estos captchas incluye un botón que te dicta el texto por el altavoz. Que pasara cuando existan librerías de análisis de voz que sean capaces de escribir un texto dictado a la perfección? (tanto windows7 como google chrome tienen soporte de voz en la actualidad). La verdad es que no quiero ni pensar en lo que pasara cuando algún bot que se dedica a mandar mensajes de spam, sea capaz de pasar el audio de un captcha a texto plano, porque ahora mismo la cosa es muy absurda.

En definitiva el concepto para diferenciar una máquina de una persona cada vez resultara más difícil, y solo se verá limitado por la habilidad del que programe a la maquina. Por eso creo que es más importante recurrir a soluciones más originales que además sean poco comunes, y esto pasa por crear nuestros propios captchas, que aunque no sean tan seguros tampoco serán de gran interés para los spamers.

Volviendo al tema de los tutoriales, en el primer tutorial vimos un ejemplo básico para crear un captcha en JavaScript que representaba un nivel de seguridad prácticamente nulo. Si representamos el mismo concepto utilizando PHP para generar los valores y validar el resultado obtendremos una mayor seguridad.

Vamos a empezar por crear un código php que generara una imagen con los valores a sumar :

Archivo php que genera la imagen del captcha
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
session_start();
// Creo los valores aleatorios y guardo el resultado
$Valor1 = rand(1,99);
$Valor2 = rand(1,99);
$_SESSION["ResultadoCaptcha"] = $Valor1 + $Valor2;
// Creo una imagen vacia de 120x30 a la que pintaremos el fondo transparente y los valores en negro
$Imagen = imagecreatetruecolor(120, 30);
$Color_Fondo = imagecolorallocate($Imagen, 255, 255, 255);
imagefill($Imagen, 0, 0, $Color_Fondo);
$Color_Texto = imagecolorallocate($Imagen, 0, 0, 0);
imagestring($Imagen, 4, 5, 5, $Valor1." + ".$Valor2." =", $Color_Texto);
// Cabecera para la imagen PNG
header('Content-Type: image/png');
// Imprimo la imagen
imagepng($Imagen);
// Liberar memoria
imagedestroy($Imagen);
?>

En primer lugar utilizamos la función session_start para inicializar la variable $_SESSION de forma que podamos conservar datos en ella y utilizarlos en varios documentos php durante la misma sesión.

En las líneas 5 y 6 creamos dos valores aleatorios de 1 a 99 con la función rand.

En la línea 7 guardamos la suma de los dos valores aleatorios dentro de la variable $_SESSION.

En la línea 10 creamos una imagen en memoria de 120x30 pixeles con la función imagecreatetruecolor.

En la línea 11 creamos un color para el fondo con la función imagecreatetruecolor, y luego en la línea 12 pintamos el fondo con el color que creamos anteriormente utilizando la función imagefill.

En la línea 13 creamos un color para el texto con la función imagecolorallocate, y luego imprimimos la operación con la función imagestring.

En la línea 17 establecemos la cabecera para la imagen que en este caso será un PNG con la función header.

En la línea 20 imprimimos los datos de la imagen de forma que el archivo php se convertirá en un archivo png, esto con la función imagepng.

Y por ultimo en la línea 23 eliminamos la imagen de la memoria con la función imagedestroy.

Con esta parte hecha solo nos quedara validar el resultado una vez introducido, para ello crearemos un segundo archivo php con el nombre "Captcha2_Ejemplo_Validar.php" :

Archivo php que valida el resultado introducido
1
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
if ($_POST["ResultadoCaptcha"] == $_SESSION["ResultadoCaptcha"]) {
echo "Captcha validado";
// Enviamos el mensaje a la base de datos, o lo que sea.....
}
else {
echo "Resultado incorrecto!";
// No hacemos nada
}
?>

En este código simplemente comprobamos si el resultado enviado es igual al resultado que se creó anteriormente en la imagen, y de ser ese el caso procedemos a guardar el mensaje, descargar el archivo o lo que sea...

Por último veamos la implementación HTML para todo esto :

Archivo php que valida el resultado introducido
1
2
3
4
<form action="../Ejemplos/Captcha/Captcha2_Ejemplo_Validar.php" method='POST'>
<img src='../Ejemplos/Captcha/Captcha2_Ejemplo_Imagen.php' style="float:left" />
<input type='text' name='ResultadoCaptcha' id='ResultadoCaptcha' value='' title='Introduce el resultado de la suma' />
</form>

En esencia al cargar la imagen "Captcha2_Ejemplo_Imagen.php" se generan los valores aleatorios para la suma y se guarda el resultado, y luego lo comprobamos mediante un POST al archivo "Captcha2_Ejemplo_Validar.php"

De esta forma este captcha no se puede hackear con JavaScript como en el ejemplo anterior, y su seguridad gana varios puntos, pero ojo que sigue sin ser perfecto ya que se podría descifrar la imagen utilizando algún algoritmo de OCR.

Y por hoy terminamos aquí, en la siguiente entrega empezaremos a crear un captcha mas original que no requerirá introducir un valor, si no que arrastraremos una imagen a una posición especifica para validar el captcha. Como siempre podéis ver el ejemplo simplificado online, o descargar el ejemplo para vuestro ordenador.

Siguiente tutorial : Captchas (3 Captcha arrastrar y soltar PHP + JQuery).


[#9] fernando 24 Marzo del 2014 a las 5:32, votos 4 de 4.
muchas gracias por tu ayuda ya tenia un captcha hecho pero no me quedaba la validacion de este pero revise tu codigo y era cuestion agregar unas cuantas lineas en verdad te lo agradezo saludos y gracias x compartir tus conocimientos =)
[#5] Susana 23 Mayo del 2013 a las 17:32, votos 2 de 3.
Muy bueno!! Muchas gracias:-)
[#4] devildrey33 28 Febrero del 2013 a las 2:03, votos 0 de 3.
3 Pues tienes razón.. había un error en el zip con el ejemplo, lo he vuelto a subir y ahora debería funcionar correctamente.

Gracias por notificármelo, Saludos!
[#3] luis bien 28 Febrero del 2013 a las 1:42, votos 2 de 2.
hola que maizz todo bien.

prove el captcha2 con xampp y tanbien en un servidor web bonde hago las pruevas y no muestra la imagen.
[#2] devildrey33 26 Febrero del 2013 a las 2:00, votos 0 de 1.
1 El captcha2 funciona con php, por lo que necesitas un servidor apache para que funcione.

Por ejemplo para windows tienes el xampp :  http://www.apachefriends.org/en/xampp.html

Si la imagen aparece como que no existe ese es el problema, si por el contrario aparece algún tipo de error entonces debe ser otro el problema

Saludos!
[#1] luis bien 26 Febrero del 2013 a las 1:32, votos 5 de 7.

Hola que maizzzzzzz todo bien

Gracias por compartir tu conocimiento con el mundo.

Descargue el captcha 2 y no funciona como el página.