
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.
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.
Postear en Twitter
Postear en Facebook
Feed RSS
Agregar a Favoritos
¡Amigo! te demorarás 10 segundos en crear tu cuenta.
Disfrutarás de todos los beneficios de DocumentoWeb.