PHP » Captcha en PHP para combatir el SPAM

 

Llevo muchos años combatiendo la inmoralidad de las técnicas del SPAM con varios métodos y el que te presentaré a continuación es el más efectivo que he creado.

La efectividad de este captcha se basa en el giro de las letras o números más la dirección en que indica una flecha.

El hecho de que haya que introducir un código ya evita gran parte de los robot de SPAM, pero en el otro porcentaje se utilizan técnicas de un nivel superior, como un software OCR (pueden reconocer carácteres a partir de las imágenes). Contra estos, ya es más difícil vencerlos, pues pensábamos que sólo el ojo humano podía reescribir el texto de una imagen, entonces, necesitamos introducir otro elemento que no tienen los robots: la capacidad de razonar.

Es justamente lo que hace este y otros buenos captchas: Te induce a pensar y escribir.

Creo que un poco más fácil de descifrar que los que tienen letras muy distorsionadas como en los ejemplos de la imagen.

Integrar el captcha en el código PHP

El código PHP está creado con la librería GD del mismo PHP (si ya tienes instalado PHP, no necesitas instalar nada adicional).

Primero, necesitamos el código que crea la imagen independiente con caracteres aleatorios (cada carácter, es una imagen) en posiciones especificas:

<?php

// cabecera
header("Content-type: image/png");

// crear la imagen (anchura,altura)
$img=imageCreate(100,60);

// colores
$blanco=imagecolorallocate($img,255,255,255);
$negro=imagecolorallocate($img,0,0,0);

// variables obtenidas por GET

$sentido=rand(1,2);

$tcaptcha=$_GET['captcha'];
$tcaptcha=base64_decode($tcaptcha);
$tcaptcha=substr($tcaptcha,1,-1);
$tcaptcha=base64_decode($tcaptcha);

$caracter1=substr($tcaptcha,0,1);
$caracter2=substr($tcaptcha,1,1);
$caracter3=substr($tcaptcha,2,1);
$caracter4=substr($tcaptcha,3,1);
$caracter5=substr($tcaptcha,4,1);


if($sentido==1){
// flecha
$string=imagecopy($img,imagecreatefrompng('flecha1.png'),31,26,0,0,40,30);

// caracteres
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter1.png"),90,$blanco,0),3,36,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_45/$caracter2.png"),0,$blanco,0),13,12,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter3.png"),0,$blanco,0),39,0,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_45/$caracter4.png"),270,$blanco,0),65,12,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter5.png"),270,$blanco,0),75,36,0,0,22,22);
}
if($sentido==2){
// flecha
$string=imagecopy($img,imagecreatefrompng("flecha2.png"),31,6,0,0,40,30);

// caracteres
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter1.png"),270,$blanco,0),8,6,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_45/$caracter2.png"),270,$blanco,0),14,31,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter3.png"),0,$blanco,0),39,36,0,2,22,20);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_45/$caracter4.png"),0,$blanco,0),64,31,0,0,22,22);
$string=imagecopy($img,imagerotate(imagecreatefrompng("caracteres_0/$caracter5.png"),90,$blanco,0),70,6,0,0,22,22);

}


// mostrar la imagen
echo imagegif($img);

// destruir la imagen
imagedestroy($img);
?>

(libreria-captcha/imagen.php)

Luego, el archivo donde vamos a generar la clave aleatoria y que incluirá el código anterior, es decir, donde se encontrarán todas las variables que necesitemos:

<?php

$abcnumeros=array(0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");

$caracter1=$abcnumeros[rand(0,35)];
$caracter2=$abcnumeros[rand(0,35)];
$caracter3=$abcnumeros[rand(0,35)];
$caracter4=$abcnumeros[rand(0,35)];
$caracter5=$abcnumeros[rand(0,35)];

$captcha=$caracter1.$caracter2.$caracter3.$caracter4.$caracter5;

// codificacion propia
$captcha_cod=base64_encode($captcha);
$captcha_cod="a".$captcha_cod."E";
$captcha_cod=str_replace("=","",$captcha_cod);
$captcha_cod=base64_encode($captcha_cod);

$tu_captcha=md5(strtolower($_POST['tu_captcha']));
$mi_captcha=$_POST['mi_captcha'];

// variables con HTML
$img_captcha='<label for="captcha"><img src="libreria-captcha/imagen.php?captcha='.$captcha_cod.'" alt="Captcha" title="El código de verificación o captcha permite verificar si eres un humano o una máquina de SPAM" /></label>';
$input_captcha='<input type="text" name="tu_captcha" id="captcha" size="10" /><input type="hidden" name="mi_captcha" value="'.md5($captcha).'" />';

?>

(libreria-captcha/variables.php)

Por último, en el formulario HTML de una página cualquiera, donde queremos integrar el captcha necesitamos incluir a las variables (variables.php) e imprimir la varible que contiene el html de la imagen ($img_captcha) y la que tiene el campo donde se debe ingresar el capcha ($input_captcha).

<?php

include('libreria-captcha/variables.php');

echo "<p>".$img_captcha."</p>";
echo "<p>".$input_captcha."</p>";

?>

Luego, solo faltaría tu código, en el cual puedes verificar si el código de verificación está correctamente escrito o no de la siguiente forma:

<?php

if($mi_captcha==$tu_captcha){
// Aquí incluyes tu código si es que el captcha se pasa exitosamente.
}else{
        // Aquí incluyes tu código si es que el captcha NO se pasa exitosamente.
}

?>

Las variables son enviadas por 2 medios codificados: md5 y uno creado por mi que usa base 64.

Vea el captcha en funcionamiento.

Diego Escares

Publicado el 15 de Mayo del 2010 por Diego Escares

1495 visitas, 1 mensaje y 3 ediciones

Mensajes

sauljp07 sauljp07 el 17 de Julio del 2010: 0

muy bueno.....

¡Amigo! te demorarás 10 segundos en crear tu cuenta.

Disfrutarás de todos los beneficios de DocumentoWeb.

Twitter Twitter Facebook Facebook Feed RSS Feed RSS

www.DocumentoWeb.com Licencia Creative Commons