Autor
|
Tema: Creación de un Captcha desde 0 (Leído 2,425 veces)
|
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(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
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
Ertai
|
Pues no esta nada mal! 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!
|
|
|
En línea
|
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
Aspirante a supervillano
Colaborador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
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($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
|
|
|
En línea
|
|
|
|
dragondeluz
Desconectado
Mensajes: 1
|
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
|
|
|
En línea
|
|
|
|
sirdarckcat
Aspirante a supervillano
Colaborador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
tienes la libreria GD? www.php.net/GDSaludos!!
|
|
|
En línea
|
|
|
|
|
|