Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Mad Antrax en 20 Noviembre 2006, 07:20 am



Título: Creación de un Captcha desde 0
Publicado por: Mad Antrax en 20 Noviembre 2006, 07:20 am
Hola, estoy intentando crear un Captcha para integrarlo en varios proyectos. La base ya esta creada, tengo el script que me genera una imagen completamente aleatoria, mi pregunta es: ¿Como hago para que el script genere una imagen apartir de una variable aleatoria y ésta sea comprobada através de un formulario?

Os dejo el código escrito y un zip preparado:

Código:
<?php
header("Content-type: image/png");

$im = imagecreatetruecolor(200, 50);
$bg = imagecolorallocate($im, mt_rand(175,255), mt_rand(175,255), mt_rand(175,255));
imagefilledrectangle($im, 0, 0, 199, 49, $bg);

$texto = array("0","1","2","3","4","5","6","7","8","9","a","b","c","x","y","z");
$fonts = array("bauhs93.ttf","bernhc.ttf","bradhitc.ttf","castelar.ttf","comic.ttf","couri.ttf","goudysto.ttf","impact.ttf","tahoma.ttf","verdana.ttf");

$reg = 200 / 7;
$rog = 50 / 4;
$rag = 200 / 6;

for ($i = 1; $i <= 6; $i++) {

//ESCRIBE TEXTO//

$t_color = imagecolorallocate($im, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
imagettftext($im, mt_rand(20,30), mt_rand(-20,20), mt_rand(($reg * $i)-3,($reg * $i)+3)-10, mt_rand(30,40), $t_color, $fonts[mt_rand(0,9)], $texto[mt_rand(0,15)]);
}

for ($i = 1; $i <= 3; $i++) {

//LINEAS HORIZONTALES//

$hl_color = imagecolorallocate($im, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255));

$var = mt_rand(-5,5);

imageline($im,0,$rog * $i,200,$rog * $i + $var,$hl_color);

}

for ($i = 1; $i <= 5; $i++) {

//LINEAS VERTICALES//

$hl_color = imagecolorallocate($im, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255));

$var = mt_rand(-3,3);

imageline($im,$rag * $i,0,$rag * $i + $var,50,$hl_color);

}


for ($i = 1; $i <= 50; $i++) {

//CRUCES//

$tmp = mt_rand(1,50);

$color1 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color2 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color3 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color4 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color5 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color6 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color7 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color8 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color9 = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));

imagesetpixel($im,$i*4,$tmp,$color1);
imagesetpixel($im,$i*4+1,$tmp+1,$color2);
imagesetpixel($im,$i*4+2,$tmp+2,$color3);
imagesetpixel($im,$i*4+1,$tmp-1,$color4);
imagesetpixel($im,$i*4+2,$tmp-2,$color5);
imagesetpixel($im,$i*4-1,$tmp+1,$color6);
imagesetpixel($im,$i*4-2,$tmp+2,$color7);
imagesetpixel($im,$i*4-1,$tmp-1,$color8);
imagesetpixel($im,$i*4-2,$tmp-2,$color9);
}

$borde = imagecolorallocate($im, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150));
imagerectangle($im,0,0,199,49,$borde);
imagerectangle($im,1,1,198,48,$borde);
imagepng($im);
?>

Aprobecho tambien para preguntar si las imagenes generadas son faciles o dificiles para ser interpretadas por un programa.

Se que hay cosas por mejorar:

1) Meter un config.php como include para poner variables globales
2) Hacer una matriz de colores para no usar tanto imagecolorallocate
3) Mejoras en general


Título: Re: Creación de un Captcha desde 0
Publicado por: Ertai en 20 Noviembre 2006, 20:11 pm
Pues no esta nada mal!  :D

Yo creo que el nivel de complejidad de la foto es bueno, contando que no hace casi imposible la lectura para el usuario (hay algunos captchas que son todo un puzzle).

Respeto a tu pregunta, ten en cuenta que tu tienes un array con las letras y números que usaras.

Código:
<?php
array("0","1","2","3","4","5","6","7","8","9","a","b","c","x","y","z");
?>

Pues en vez de hacer un rand a pelo, haz ese rand y guardala en una variable. Concatena todos los carácteres y números que usas, de tal manera que de la palabra deseada, pasale un md5 y guardalo en $_SESSION['var'].

Luego, cuando recibas el formulario, compruebas la validez con la variable de sesión  ;)

Saludos y suerte!


Título: Re: Creación de un Captcha desde 0
Publicado por: sirdarckcat en 21 Noviembre 2006, 01:07 am
:P yo tengo este:
Código:
<?php
// archivos necesarios:
// t,gif
// LCALLIG.ttf
// l_10646.ttf
// MTCORSVA.ttf
// bauh.ttf
session_start();

if(!isset($_GET['image']) && isset($_REQUEST['c'],$_SESSION['capcha'])){
if($_REQUEST['c']==join($_SESSION['capcha'],'')){
unset($_SESSION['capcha']);
$_SESSION['capcha']=null;
unset($_SESSION['capcha']);
// HACER ESTO, CUANDO CONFIRME QUE ERES HUMANO!
echo "SI eres humano!";
}else{
// HACER ESTO, CUANDO VI QUE TE EQUIVOCASTE
echo "Te ekivocaste<br>";
}
}

if(!isset($_GET['image'])){
?>
<img src='?image'>
<form method=POST>
Mete las letras de arriba.
<input name=c value="" size=10 type=text>
<input type=submit>
</form>
<?php
exit;
}

/*
$image = ImageCreateFromGIF("t.gif");
COLOR = ImageColorAllocate($image, 255, 255, 255);
imageLine($image, INICIO_X, INICIO_Y, FIN_X, FIN_Y, COLOR);
ImageTTFText($image, TAMAÑO, ANGULO, INICIO_X, INICIO_Y, COLOR, FUENTE, TEXTO);
Header("Content-Type: image/Png");
imagePng($image);
ImageDestroy($image);
*/


$image = ImageCreateFromGIF("t.gif");
$FUENTE[]="LCALLIG.TTF";
$FUENTE[]="l_10646.ttf";
$FUENTE[]="MTCORSVA.TTF";
$FUENTE[]="LCALLIG.TTF";
$FUENTE[]="bauh.TTF";
$FUENTE[]="l_10646.ttf";
$FUENTE[]="MTCORSVA.TTF";
$FUENTE[]="MTCORSVA.TTF";
$FUENTE[]="bauh.TTF";
$FUENTE[]="bauh.TTF";
$FUENTE[]="LCALLIG.TTF";
$FUENTE[]="l_10646.ttf";
$FUENTE[]="bauh.TTF";
$FUENTE[]="LCALLIG.TTF";
$FUENTE[]="l_10646.ttf";
$FUENTE[]="MTCORSVA.TTF";

for ($i=0;$i<15+rand()%15;$i++){
$COLOR = ImageColorAllocate($image, rand()%255, rand()%255, rand()%255);
imageLine($image, rand()%500, rand()%500, rand()%500, rand()%500, $COLOR);
}
for ($i=0;$i<5;$i++){
$COLOR = ImageColorAllocate($image, rand()%200, rand()%200, rand()%200);
$x[$i]=chr(97+rand()%25);
imageLine($image, rand()%500, rand()%700-200, rand()%500, rand()%500, $COLOR);
ImageTTFText($image, 35+rand()%15, 310+rand()%100, 25+$i*100, rand()%150+50, $COLOR, $FUENTE[8+(rand()*rand())%8], $x[$i]);
imageLine($image, rand()%500, rand()%500, rand()%500, rand()%500, $COLOR);
}
/*for ($i=0;$i<5;$i++){
$COLOR = ImageColorAllocate($image, rand()%200, rand()%200, rand()%200);
$x[5+$i]=chr(97+rand()%25);
imageLine($image, rand()%700-200, rand()%500, rand()%500, rand()%500, $COLOR);
ImageTTFText($image, 35+rand()%15, 310+rand()%100, 25+$i*100, rand()%150+250, $COLOR, $FUENTE[(rand()*rand())%8], $x[5+$i]);
imageLine($image, rand()%500, rand()%500, rand()%500, rand()%500, $COLOR);
}*/
for ($i=0;$i<20+rand()%15;$i++){
$COLOR = ImageColorAllocate($image, rand()%255, rand()%255, rand()%255);
imageLine($image, rand()%600-100, rand()%700-200, rand()%500, rand()%500, $COLOR);
}
$_SESSION['capcha']=$x;
Header("Content-Type: image/JPEG;filename: cha.jpg");
imageJpeg($image);
ImageDestroy($image);
?>

anexo t.gif

las fuentes, pueden usar las que quieran :P


Título: Re: Creación de un Captcha desde 0
Publicado por: dragondeluz en 8 Diciembre 2006, 00:09 am
Hola muchachos, hace tiempo estaba buscando algo asi para un portal web, pero esto me parece genial.

Sirdarckcat, este codigo que enviaste , no se si sera que no habre entendio bien como funciona pero yo copie las fuentes y el gif  a la carpeta donde este el file.php, lo ejecuto pero no me genera la imagen... alguna idea de que pued epasar o es que no entendi bien como es esto?.

Gracias


Título: Re: Creación de un Captcha desde 0
Publicado por: sirdarckcat en 9 Diciembre 2006, 01:09 am
tienes la libreria GD?

www.php.net/GD

Saludos!!