Creación de un Captcha desde 0

Iniciado por Mad Antrax, 20 Noviembre 2006, 07:20 AM

0 Miembros y 1 Visitante están viendo este tema.

Mad Antrax

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:

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

$im imagecreatetruecolor(20050);
$bg imagecolorallocate($immt_rand(175,255), mt_rand(175,255), mt_rand(175,255));
imagefilledrectangle($im0019949$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($immt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
imagettftext($immt_rand(20,30), mt_rand(-20,20), mt_rand(($reg $i)-3,($reg $i)+3)-10mt_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($immt_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($immt_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($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color2 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color3 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color4 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color5 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color6 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color7 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color8 imagecolorallocate($immt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
$color9 imagecolorallocate($immt_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($immt_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
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

Ertai

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.


<?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!
Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}

sirdarckcat

:P yo tengo este:

<?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($imagerand()%255rand()%255rand()%255);
imageLine($imagerand()%500rand()%500rand()%500rand()%500$COLOR);
}
for (
$i=0;$i<5;$i++){
$COLOR ImageColorAllocate($imagerand()%200rand()%200rand()%200);
$x[$i]=chr(97+rand()%25);
imageLine($imagerand()%500rand()%700-200rand()%500rand()%500$COLOR);
ImageTTFText($image35+rand()%15310+rand()%10025+$i*100rand()%150+50$COLOR$FUENTE[8+(rand()*rand())%8], $x[$i]);
imageLine($imagerand()%500rand()%500rand()%500rand()%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($imagerand()%255rand()%255rand()%255);
imageLine($imagerand()%600-100rand()%700-200rand()%500rand()%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

dragondeluz

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

sirdarckcat

tienes la libreria GD?

www.php.net/GD

Saludos!!