Generovanie captcha v php - 1. diel
Toto je tutoriál na captcha generovanú pomocou php. Predpokladám základná znalosť jazyka PHP a aspoň pasívne znalosť GD knižnice.
Pre začiatok si povieme, čo to vlastne tá captcha je. Captcha je tzv. Turingov test. Teda test, ktorý má za úlohu preveriť, či ste človek, alebo stroj. Používa sa hlavne v diskusiách, pri registráciách na webové stránky, alebo všade, kde je potrebné ochrany proti spamu. Naša captcha bude veľmi jednoduchá, a pre nasadenie na ostrých weboch ju toho bude veľa chýbať. Na základné pochopenie princípov ale postačí.
Začneme tým, že si vytvoríme obrázok, na ktorý budeme kresliť obsah captcha. Ako som povedal v úvode, použijeme k tomu GD knižnicu, ktorá sa používa pre generovanie obrázkov v PHP, a je vynikajúci.
// šířku a výšku je třeba zadat do proměnných, později s nimi budeme pracovat $sirka = 270; $vyska = 75; // samotné generování $img = imagecreate($sirka, $vyska);
V základnom generovanie je predvolená farba pozadia nastavená ako čierna, preto musíme vykresliť biele pozadie.
$background = imagecolorallocate($img, 255, 255, 255); // vykreslední pozadí v našem obrázku imagefilledrectangle($img, 0, 0, $sirka, $vyska, $background);
Je potrebné urobiť maximum pre to, aby captcha bola nečitateľná pre roboty, ale ľahko čitateľná pre človeka. Začneme vygenerovaním náhodných farieb, ktorými budeme do obrázka vykresľovať písmená a šum.
// pro barvy si vytvoříme pole $colors = array(); for($i = 0; $i<100;$i++){ $colors[] = imagecolorallocate($img, rand(1,255), rand(1,255), rand(1,255)); }
Teraz budeme do nášho pripraveného obrázku vykresľovať text. Môže to pôsobiť zložito, ale žiadna veda to nie je. Všetko čo sa týka textu bude generované náhodne. Všetky možné znaky, ktoré chceme do formulára vykresliť sú uložené v poli $ znaky. Počet znakov je uložený v premennej $ znaku. Pre farbu písma použijeme naše náhodne vygenerované farby. Za zmienku stojí, že som si uložil font do zložky s projektom, a načítám ho do premennej $ font. Pokiaľ chcete použiť akékoľvek iné písmo, stačí zmeniť hodnotu v premennej $ font. Všetky písma nájdete v operačnom systéme windows v priečinku písma, alebo si ich môžete stiahnuť napr. Tu
$znaky = array("a", "b", "c", "d", "e", "f", "g", "1", "2", "3", "4", "5", "6", "ě", "š", "č", "ř", "ž", "ů", "ú"); $znaku = 6; $font = $_SERVER["DOCUMENT_ROOT"].'/corbelb.ttf'; //úvodní vzdálenost vykreslení písmena $vzdalenost = 10; for($i = 0; $i<$znaku;$i++){ //ve funkci pro generování písmen je použito vše náhodně - úhel náklonu, vzdálenost, barva, velikost imagettftext($img, rand(45,50), -30 + rand(0, 60), $vzdalenost, 50 + rand(0, 10), $colors[array_rand($colors)], $font, $znaky[array_rand($znaky)]); //vzdálenost vykreslení dalšího písmena se přičte náhodně $vzdalenost += rand(30, 45); }
Teraz sa pozrieme na tú nečitateľnosť. Vykreslíme na písmo šum. Šum budú tvoriť náhodne generované čiary s dĺžkou 1 - 4px. Pre farbu použijeme opäť naše náhodne generované farby.
for($i = 0; $i<1000;$i++){ $x1 = rand(5, $sirka - 5); $y1 = rand(5, $vyska - 5); $x2 = $x1 - 4 + rand(0, 8); $y2 = $y1 -4 + rand(0, 8); imageline($img, $x1, $y1, $x2, $y2, $colors[rand(0, count($colors) - 1)]); }
A naša captcha je hotová.
Nič zložitého to nebolo. Týmto Prvý diel nášho tutoriálu končí. Nabudúce si našu captcha vykreslíme do webového formulára, a budeme overovať, či sa zadaný text zhoduje s textom vykresleným v obrázku. K tomu ale budeme musieť výsledný obrázok niekam ukladať. My si ho teraz len vykreslíme do okna prehliadača, aby sme videli, že kod funguje.
header("content-type: image/jpeg"); imagejpeg($img);
Celý funkčný príklad je k stiahnutiu v súbore ako archív. Funkčné príklad si môžete prezrieť tiež tu