Jump to content
Hertz

Generare Cod Imagine Captcha

Recommended Posts

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

[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 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 [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...>

<?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);
?

Ajutat de un anonim.

Link to comment
Share on other sites

va dau si eu codul meu pentru captcha

asa arata

captchacc2.png

aveti nevoie de un .ttf ca sa iti deseneze literele asa cum vrei tu.

puteti alege dintre cele de aici

http://www.webpagepublicity.com/free-fonts.html

valoarea corecta a captcha-ului cu care trebuie sa faceti compariatia este in $_SESSION['human']


<?php
include ('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);


?>

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...