Codurile CAPTCHA ofera o protectie suplimentara daca vrei sa reduci cantitatea de spam venita din partea spiderilor. Astfel, pentru a te asigura ca un comentariu nu este de fapt spam si ca este nevoie sa fie om cel care vrea sa scrie pe site-ul tau ai nevoie de o imagine care ar trebui sa fie mai greu de citit (intuitia este inca greu de emulat de calculatoare). Dupa cum spune chiar si denumirea…. CAPTCHA este acronim pentru “Completely Automated Public Turing test to tell Computers and Humans Apart”.
Inainte de toate trebuie sa stii ca niciun sistem antispam nu protejeaza in proportie de 100%.
Cum ar trebui sa functioneze sistemul CAPTCHA?
In principiu un sistem CAPTCHA ia la intamplare o serie de caractere si le afiseaza intr-o imagine pastrand in acelasi timp acea serie de caractere intr-o variabila de sesiune. Utilizatorul, citind caracterele respective de pe imagine, va trebui sa le copieze intr-un element de formular de tip text. Ulterior, scriptul PHP va compara sirul de caractere introdus de utilizator cu sirul de caractere pastrat in variabila de sesiune si, daca egalitatea se va confirma, va permite continuarea executiei codului.
Codul…
Vom porni de la o secventa de cod gasita pe site-ul Code Sucks:
Astfel, intr-un fisier pe care il vom denumi captcha.php vom scrie:
<? function create_captcha() { //definim numarul de caractere care vrem sa apara in imagine $length = 6; //definim caracterele dintre care vrem sa alegem pe cele 6 $options = 'abc2def3ghj4kmn5pqr6stu7vwx8yz9'; $option_length = (strlen($options)-1); $captcha = ''; $i = 0; while ($i<$length) { //selectam random o pozitie din tot sirul de caractere $options $random = mt_rand(0, $option_length); //si adaugam caracterul care se afla la pozitia respectiva la codul captcha $captcha .= $options[$random]; //vom face la fel pana in momentul in care numarul de caractere din codul captcha ajunge la 6 $i++; } //returnam codul captcha return $captcha; } //preluam un cod captcha $captcha = create_captcha(); //pastram codul captcha intr-o variabila de sesiune numita captcha $_SESSION['captcha'] = $captcha; //pregatim tot ce trebuie pentru realizarea imaginii... astfel, vom spune serverului si browserului sa interpreteze codul php ca fiind o imagine header("content-type: image/gif"); //vom realiza imaginea pe un fundal destul de colorat astfel incat sa derutam eventualele motoare care pot citi caractere $image=imagecreatefromjpeg("http://adresa.ta/unde/se/gaseste/background-ul"); // vom scrie cu gri sau orice alta culoare $grey = imagecolorallocate($image, 152,152,152); //introducem codul captcha peste fundalul pe care l-am importat. imagestring($image, 5, 45, 15, $captcha, $grey); //cream un gif care contine codul captcha imagegif($image); //si o distrugem din memoria serverului imagedestroy($image); ?>
Bineinteles ca imaginea poate fi mult mai complexa si trebuie sa ai grija ca background-ul sa fie cat mai apropiat de culoarea fontului folosit pentru afisarea codului. Exista deja spideri care ar putea citi codul captcha pe care noi l-am realizat acum.
Printre modalitatile prin care poti sa te asiguri ca citirea codului va fi mai grea pentru spideri se mai numara:
– folosirea unui unui font care este mai greu de inteles.
– scrierea caracterelor in diverse unghiuri fata de baza imaginii.
– (ceea ce am mentionat mai sus) folosirea unui background cat mai asemanator culorii fontului cu care este scris codul; o cautare pe Google ar trebui sa iti dea destule optiuni, daca nu poti sa iti faci tu unul.
Background-ul pe care l-am gasit eu arata asa:
L-am gasit la adresa http://www.canadianclassicrock.com/wp/wp-content/plugins/si-contact-form/captcha/backgrounds/
Cum integram totul
Acum ca am facut codul CAPTCHA si l-am pastrat intr-o variabila de sesiune, tot ce ne mai trebuie este sa chemam acest script si apoi sa comparam codul captcha introdus de utilizator cu codul captcha pastrat de sesiune.
In pagina de formular vom adauga imaginea CAPTCHA si vom face un camp de introducere a codului astfel:
<form method="post" action="validare.php"> ... <img src="captcha.php" /><!-- imaginea captcha o introduceti pur si simplu prin tagul img care cheama scriptul ce va fi interpretat ca imagine --> <label for="captcha">Introduceti codul din imagine</label> <input type="text" name="captcha" /> ... </form>
Sper ca iti dai seama ca nu am pus tot formularul cu toate campurile ce trebuie completate, ci doar campurile care sunt importante pentru codul captcha…
Apoi, in fisierul de validare, vei scrie ceva de genul…
<?php session_start();//ne asiguram ca avem sesiunea pornita... if($_SERVER['REQUEST_METHOD']=='POST') { $captcha = filter_input(INPUT_POST,'captcha',FILTER_SANITIZE_STRING);//ne asiguram ca nu avem de-a face cu oameni rai... if($_SESSION['captcha']==$captcha) // verificam daca exista egalitate si actionam in functie de asta... { ... } else { ... } } ?>
Bineinteles ca si aici am scris doar partea care ma intereseaza pe mine pentru captcha…
Lecturi suplimentare:
Un foarte bun tutorial cu mai multe versiuni (mai avansate) de Captcha: http://www.the-art-of-web.com/php/captcha/
Realizator de scripturi Captcha pentru cei care nu au timp sau sunt prea lenesi pentru a invata: http://www.captchacreator.com/v-customize.html