viernes, 6 de abril de 2007

Captcha seguridad y evitar spam

En muchas ocasiones cuando tienes un formulario en tu página web de registro, login, para poner comentarios, etc. es muy recomendable utilizar este sistema de seguridad para evitar altas fraudulentas, spam en los comentarios y diversos ataques.


Este sistema consiste en una imagen que contiene una secuencia de caracteres aleatorios. El usuario debe introducir esa secuencia en una caja de texto paranconfirmar que no se trata de un robot. Estas imágenes se presentan ligeramente distorsionadas y son realmente difíciles de capturar por un robot.


A continuación el código del captcha.php fichero que nos devuelve una imagen para verificar en el formulario.



<?php
/*
Iniciamos la sesión. Esto se utiliza para el envio de variable de sesión.
Mediante las variables de sesión enviamos la cadena de 5 caracteres que el
usuario debe introducir en el formulario para verificar que no se trata de
un robot.


Si quieres saber más sobre sesiones visita:
http://www.php.net/manual/es/ref.session.php
*/
session_start();
/*
Creación de una cadena aleatoria a partir de las funciones de fecha de php.
La función md5() retorna una cadena de 32 caracteres alfanuméricos, mediante el algoritmo de encriptación md5.
*/
$md5 = md5(microtime() * mktime());
/*
Para este ejemplo sólamente necesitamos 5 caracteres de los 32 que genera la función md5() por lo tanto escojemos los 5 primeros caracteres de la cadena.
*/
$string = substr($md5,0,5);
/*
A continuación creamos una imagen a partir de un fondo que hemos subido previamente al servidor. Generalmente este fondo se encuentra distorsionada.
*/
$captcha = imagecreatefrompng("./captcha.png");
/*
Editamos los colores de la imagen, tanto de los caracteres y de las líneas
*/
$color_letras = imagecolorallocate($captcha, 0, 0, 0);
$color_lineas = imagecolorallocate($captcha,255,0,0);


/*
Añadiremos unas cuantas líneas a nuestra imagen para evitar que que los robots lean el contenido de la imagen.
*/
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
imageline($captcha,rand(0,100),0,rand(0,50),50,$color_lineas);
/*
Ahora escribimos la cadena generada aleatoriamente en la imagen
*/
imagestring($captcha, 5, 20, 10, $string, $color_letras);
/*
Encriptamos la variable de sesión con la función md5() y la establecemos como una variable de sesión, para poder verificarla al enviar el formulario.
*/
$_SESSION['codigo_verificacion'] = md5($string);
/*
Devolvemos la imagen para mostrarla en el formulario.
*/
header("Content-type: image/png");

imagepng($captcha);
?>


A continuación presentamos el archivo que verifica si el código introducido
es correcto o no: comprobar.php



<?php
session_start();


if(md5($_POST['codigo']) != $_SESSION['codigo_verificacion']){
/*
Parte del programa que se ejecuta si la el código no es correcto.
*/
} else {
/*
Trozo de código que se ejecuta si la confirmación se realiza con

éxito.
*/
}
?>


Por último tienes que insertar un formulario del estilo:

el archivo 'formulario.html'


<form action="comprobar.php" method="post">
<table width="500"><tr><td>
<tr><td><b>Nombre: </b></td><td><input type="text" name="nombre" size="20" maxlength="30"></td></tr>
<tr><td><b>Email: </b></td><td><input type="text" name="email" size="20" maxlength="100"></td></tr>
<tr><td><b>Comentario: </b></td><td><input type="text" name="comentario" size="20" maxlength="200"></td></tr>
</table>
<p align="center">
<b>*Código de confirmación:</b> <img src="captcha.php" /> <input type="text" name="codigo" size="10">
</p>
<br><br>
<input type="reset" value=" Borrar "> <input type="submit" value=" Enviar ">
</form>