[PHP]Generare Cod Imagine Captcha

In jos

[PHP]Generare Cod Imagine Captcha

Mesaj Scris de Max la data de Dum Sept 07, 2008 7:24 pm

Î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.dll

După 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.


<?php

error_reporting(E_ALL); // setati pe 0 daca nu vreti sa se afiseze erorile
session_start(); // se porneste sesiunea
ob_start(); // se initializeaza bufferul pentru a trimite headerele si textul in ordine
// se include fisierul cu functii
include_once('functions.php');

// se seteaza variabila de sesiune care tine minte codul
if (!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><br />
<a href="img_code.php" target="_blank"><img src="img_code.php"
alt="COD CAPTCHA" width="100" height="40" border="0" /></a>
<form id="form1" name="form1" method="post" action="">
<label>Introduceti codul din imagine<br />
<input type="text" name="cod" />
</label>
<br />
<br />
<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 sesiune

if (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 browser
ob_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 www.phpromania.net
// $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...>

<?php

error_reporting(E_ALL); // setati pe 0 daca nu doriti sa se afiseze erorile
session_start(); // se initializeaza sesiunea in pagina curenta
// deoarece acest script se cere ca fisier separat (ca imagine)

// se include fisierul cu functii
include_once('functions.php');

// se seteaza variabila care tine minte codul
if (!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 imaginea
header('Content-type: image/jpeg');
// daca exista poza de preia
if (is_file('images/poza_captcha.jpg'))
{
$img = imagecreatefromjpeg('images/poza_captcha.jpg');
}
// daca nu exista poza se genereaza una dinamic
else
{
$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 imaginea
imagejpeg($img);
imagedestroy($img);
?

Max
Moderator
Moderator

Numarul mesajelor : 53
Varsta : 30
Localitate : Confidential
Stare de spirit : Rakiu
Data de inscriere : 23/08/2008

Vezi profilul utilizatorului

Sus In jos

Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum