O mare problema in ziua de azi este spam-ul.
Cea mai simpla modalitate de a evita spam-ul este folosind Captcha. Aceasta face diferenta intre un calculator si o fiinta umana. Un calculator nu poate citi ceea ce scrie intr-o imagine, de aceea vom folosi si noi o poza.
Incepem prin a creea fisierul poza.php. Acest fisier va creea o poza cu un text ales de noi.
header('Content-type: image/jpeg'); // Acest fisier va afisa o poza in format jpg
$width = 60; // Latimea pozei ce va fi creata
$height = 24; // Inaltimea pozei ce va fi creata
$my_image = imagecreatetruecolor($width, $height); // Poza propriu-zisa este creata
imagefill($my_image, 0, 0, 0xFFFFFF); // Fundalul pozei va fi alb
Pana acum am creat o imagine cu o latime de 60 pixeli, o inaltime de 24 de pixeli si fundal alb.
Adaugam putine distorsiuni:
for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}
Am inserat 40 de pixeli de culoarea neagra. Acesti pixeli vor avea coordonate aleatorii de fiecare data cand o poza este afisata.
Scriem pe poza si textul necesar:
$x = rand(1,10); // Coordonata X a coltului stanga sus.
$y = rand(1,10); // Coordonata Y a coltului stanga sus
$rand_string = rand(10000,99999); // Obtinerea unui numar aleatoriu intre 10000 si 99999
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000); // Numarul aleatoriu obtinut mai devreme este scris in poza
Acum vom salva string-ul din poza intr-un cookie. Acest cookie va fi citit in momentul in care un user completeaza un form si comparat cu valoarea introdusa de el in campul de verificare.
setcookie("cookie-captcha", (md5($rand_string)), time()+3600, "/"); // Setam un cookie in care salvam valoarea codata a stringului obtinut mai devreme ($rand_string).
imagejpeg($my_image); // Crearea pozei in format jpg
imagedestroy($my_image); // Poza este stearsa
In acest exemplu cookie-ul se numeste cookie-captcha, continutul acesteia va fi valoarea codata a $rand_string, este valabil o ora (time()+3600) pe tot domeniul dumneavoastra ( "/" )
Poza este stearsa (imagedestroy) pentru a salva spatiu pe server. Imaginati-va ca aveti 10000 de vizitatori pe ora - vor fi create 24000 de astfel de poze si vor ramane pe server-ul dumneavoastra.
Fisierul complet poza.php va fi:
<?php
header('Content-type: image/jpeg');
$width = 60;
$height = 24;
$my_image = imagecreatetruecolor($width, $height);
imagefill($my_image, 0, 0, 0xFFFFFF);
for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}
$x = rand(1,10);
$y = rand(1,10);
$rand_string = rand(10000,99999);
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000);
setcookie("cookie-captcha", (md5($rand_string)), time()+3600, "/");
imagejpeg($my_image);
imagedestroy($my_image);
?>
Acum ca poza este creata si valoarea scrisa in poza este codata in cookie este timpul sa validam.
Poza creata de poza.php va fi inserata in html ca o poza normala:
<img src="poza.php" alt="Poza de verificare" />
Sa nu uitam de input:
<input type="text" name="numar_verificare" size="5" max-length="5" />
Definim variabilele:
$numar_verificare = $_REQUEST['numar_verificare'];
$text_corect = $_COOKIE['cookie-captcha']);
Nu uitati ca in cookie valoarea din poza este criptata md5.
Acum comparam textul introdus de utilizator (criptat md5) cu cel aflat in cookie:
<?php
if(md5($numar_verificare) != $_COOKIE['cookie-captcha']){
echo 'Ne pare rau dar textul introdus nu corespunde cu cel din imagine';
}
else
{
echo 'Textul corespunde cu cel din imagine.';
}
>
Bineinteles ca in locul echo-ului 'Textul corespunde cu cel din imagine.' veti pune un mysql_query sau ce aveti nevoie.
Puteti vedea si un exemplu aici.
Am implementat captcha complet functional cu doar 17 linii de cod.