Hertz Posted July 18, 2008 Report Posted July 18, 2008 În continuare o sã vã spun cum am facut eu o imagine cu texte aleatoare pentru a putea fi folositã într-un formular ca validare captcha. Stiu cã se poate face treaba asta în mult mai multe moduri, dar eu aºa am ales sã o fac ºi încerc sã vã descriu paºii mai jos. Instalare librãria graficã GDÎn primul rând trebuie sã aveþi libraria graficã GD activã, iar pentru asta puteþi verifica cu funcþia gd_info() daca este sau nu activã. Dacã nu este instalatã cel mai rapid editaþi fiºierul php.ini ºi scoateþi caracterul ; din faþa liniei extension=php_gd2.dllDupã restartarea serverului ar trebui sã fie deja activã, daca nu, atunci trebuie sã urmaþi paºi din manualul php pentru a copia libraria. Generarea unei imagini cu un text aleator Pentru aceasta eu am creat 3 fiºiere, dar tot codul se poate scrie ori în 2 fiºiere ori în 4 depinde cum vrea fiecare... Primul fiºier numit index.php iniþializeazã o variabilã de sesiune care þine minte codul din imagine, apoi afiºeazã formularul cu imaginea ºi câmpul în care se introduce codul. <?phperror_reporting(E_ALL); // setati pe 0 daca nu vreti sa se afiseze erorilesession_start(); // se porneste sesiuneaob_start(); // se initializeaza bufferul pentru a trimite headerele si textul in ordine// se include fisierul cu functiiinclude_once('functions.php');// se seteaza variabila de sesiune care tine minte codulif (!isset($_SESSION['cod_captcha'])) { $_SESSION['cod_captcha'] = gen_pass(4,true,'L'); }else // daca variabila exista atunci se preia codul din ea si se genereaza altul nou { $cod_vechi = $_SESSION['cod_captcha']; $_SESSION['cod_captcha'] = gen_pass(4,true,'L'); }// mai departe de afiseaza pagina html cu formularul?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Untitled Document</title></head><body>[url="img_code.php"][img=img_code.php][/url]<form id="form1" name="form1" method="post" action=""> <label>Introduceti codul din imagine <input type="text" name="cod" /> </label> <label> <input type="submit" name="Submit" value="Verifica" /> </label></form><?php// aceasta parte a codului poate fi scrisa si in pagina separata dar // atunci trebuie specificata la form la action numele paginii// atentie. daca portiunea asta se scrie in pagina separata// atunci nu uitati sa preluati codul vechi din sesiuneif (isset($_POST['cod'])) // daca a fost trimisa variabila cod { if ($_POST['cod'] == $cod_vechi) // se verifica daca este la fel cu cel vechi { echo 'Codul este corect'; } elseif(empty($_POST['cod'])) { echo 'Nu a fost introdus nici un cod'; } else { echo 'Codul introdus este [b]'.$_POST['cod'].'[/b] iar codul din imagine este [b]'.$cod_vechi.'[/b]'; } }// mai departe se inchid tagurile html?></body></html><?php// se goleste bufferul si se trimite pagina la browserob_end_flush();?>Urmatoarea paginã se numeºte functions.php ºi este cea care conþine funcþia care genereazã numerele aleatoare sau textul aleator ºi care este inclusã in index.php <?php//*********************************************************************// functia de generare parola preluata de la [url]www.phpromania.net[/url]// $digits = numarul de caractere pe care parola poate sa il contina (intre 4 si 29) // $c = daca true, I,i,L,l va fi schimbat in 1 sau O sau o va fi schimbat 0 (Zero)// pentru a preveni completarea eronata a parolei // $st = pentru "U" = upper, "L" = lower, null=casesensitive function gen_pass($digits,$c,$st) { if(!ereg("^([4-9]|((1|2){1}[0-9]{1}))$",$digits)) // 4-29 chars allowed $digits=4; for( ; ; ) { $pwd=null; $o=null; // generare parola .... for ($x=0; $x<$digits; ) { $y = rand(1,1000); if($y>350 && $y<601) $d=chr(rand(48,57)); if($y<351) $d=chr(rand(65,90)); if($y>600) $d=chr(rand(97,122)); if($d!=$o) { $o=$d; $pwd.=$d; $x++; } } // daca doriti ca utilizatorul sa nu confunda O sau 0 ("Of" sau "Zero") // sau 1 sau l ("Unu" sau "L"), seteaza $c=true; if($c) { $pwd=eregi_replace("(l|i)","1",$pwd); $pwd=eregi_replace("(o)","0",$pwd); } // daca PW se incadreaza scopului (e.g. aceasta regexpression) returneaza valoarea, altfel genereaza una noua // (puteti schimba aceasta expresie regulata oricum doriti ....) if(ereg("^[a-zA-Z]{1}([a-zA-Z]+[0-9][a-zA-Z]+)+",$pwd)) break; } if($st=="L") $pwd=strtolower($pwd); if($st=="U") $pwd=strtoupper($pwd); return $pwd; }?>Ultimul fiºier se numeºte img_code.php ºi conþine scriptul care genereazã imaginea în paginã ºi este apelat în pagina index.php prin <img src...> <?phperror_reporting(E_ALL); // setati pe 0 daca nu doriti sa se afiseze erorilesession_start(); // se initializeaza sesiunea in pagina curenta// deoarece acest script se cere ca fisier separat (ca imagine)// se include fisierul cu functiiinclude_once('functions.php');// se seteaza variabila care tine minte codulif (!isset($_SESSION['cod_captcha'])) { $_SESSION['cod_captcha'] = gen_pass(4,true,'L'); }// atentie, aici nu trebuie regenerat codul daca variabila de sesiune// exista deja pentru ca altfel nu va mai corespunde codul// in pagina care face verificarile// se genereaza imagineaheader('Content-type: image/jpeg');// daca exista poza de preiaif (is_file('images/poza_captcha.jpg')) { $img = imagecreatefromjpeg('images/poza_captcha.jpg'); }// daca nu exista poza se genereaza una dinamicelse { $img = imagecreate(100,40); $fundal = imagecolorallocate($img, 150, 200, 100); $green = imagecolorallocate ($img,0,255,0); // se creaza grila de linii for($nr = 0; $nr<=40; $nr++) { imageline($img,0,$nr,100,$nr,$green); $nr += 5; } for($nr = 0; $nr<=100; $nr++) { imageline($img,$nr,0,$nr,40,$green); $nr += 5; } }$culoare = imagecolorallocate($img,0,0,153); $font = 5;// se scrie codul pe imagine imagestring($img, $font, 5, 3, $_SESSION['cod_captcha'], $culoare); // se afiseaza imagineaimagejpeg($img);imagedestroy($img);?Ajutat de un anonim. Quote
moubik Posted July 18, 2008 Report Posted July 18, 2008 va dau si eu codul meu pentru captchaasa arataaveti nevoie de un .ttf ca sa iti deseneze literele asa cum vrei tu.puteti alege dintre cele de aicihttp://www.webpagepublicity.com/free-fonts.htmlvaloarea corecta a captcha-ului cu care trebuie sa faceti compariatia este in $_SESSION['human']<?phpinclude ('config.php');$_SESSION['human'] = '';for ($i=0 ; $i < 6 ; $i++ ){ $_SESSION['human'] .= strtoupper(chr(rand(97,122)));}$imageX = 160;$imageY = 40;$captcha = imagecreatetruecolor($imageX, $imageY);for ($i=0 ; $i < $imageX; $i++){ $circleColor = imagecolorallocate($captcha, rand(0, 255), rand(0, 255), rand(0, 255)); imageellipse($captcha, rand(0, $imageX), rand(0, $imageY), rand($imageX / 10, $imageX / 10 * 2), rand($imageX / 10, $imageX / 10 * 2), $circleColor);}for ($i=0 ; $i < $imageX; $i++){ $circleColor = imagecolorallocatealpha($captcha, rand(0, 255), rand(0, 255), rand(0, 255), rand(75, 127)); imagefilledellipse($captcha, rand(0, $imageX), rand(0, $imageY), $imageX / 10, $imageX / 10, $circleColor);}$font = 'font/matrix.ttf';$fontSize = 25;$angle = 0;$box = imagettfbbox($fontSize, $angle, $font, $_SESSION['human']);$ttfX = (int) rand( 0, $imageX / 6 );$ttfY = $imageY / 2 + $imageY / 4;$k=0;while($k < strlen($_SESSION['human'])){ $angle = ((rand(0,1) == 0) ? rand(0, 20) : rand(340, 360)); $ttfColor = imagecolorallocate($captcha, rand(0, 50), rand(0, 50), rand(0, 50)); imagettftext($captcha, $fontSize, $angle, $ttfX + $k * 20, $ttfY, $ttfColor, $font, $_SESSION['human'][$k]); imagettftext($captcha, $fontSize, $angle - rand(0, 5), $ttfX + $k * 20, $ttfY, $ttfColor, $font, $_SESSION['human'][$k]); imagettftext($captcha, $fontSize, $angle + rand(0, 5), $ttfX + $k * 20, $ttfY, $ttfColor, $font, $_SESSION['human'][$k]); $k++;}for ($i=0 ; $i < $imageX / 3; $i++){ $circleColor = imagecolorallocatealpha($captcha, rand(0, 255), rand(0, 255), rand(0, 255), rand(115, 127)); imagefilledellipse($captcha, rand(0, $imageX), rand(0, $imageY), rand($imageX / 10, $imageX / 10 * 2), rand($imageX / 10, $imageX / 10 * 2), $circleColor);}for ($i=0 ; $i < $imageX / 3; $i++){ $lineColor = imagecolorallocatealpha($captcha, rand(0, 255), rand(0, 255), rand(0, 255), rand(100, 127)); imageline($captcha, rand(0, $imageX), rand(0, $imageY), rand(0, $imageX), rand(0, $imageY), $lineColor);}header('Content-type: image/png');imagepng($captcha);imagedestroy($captcha);?> Quote