Generování captchy v php - 1. díl

PHP Ostatní Generování captchy v php - 1. díl

Toto je tutoriál na captcha generovanou pomocí php. Předpokládám základní znalost jazyka PHP a alespoň pasivní znalost GD knihovny.

Pro začátek si řekneme, co to vlastně ta captcha je. Captcha je tzv. Turingův test . Tedy test, který má za úkol prověřit, jestli jste člověk, nebo stroj. Používá se hlavně v diskusích, při registracích na webové stránky, nebo všude, kde je třeba ochrany proti spamu. Naše captcha bude velmi jednoduchá, a pro nasazení na ostrých webech ji toho bude hodně chybět. Na základní pochopení principů ale postačí.

Začneme tím, že si vytvoříme obrázek, na který budeme kreslit obsah captchy. Jak jsem řekl v úvodu, použijeme k tomu GD knihovnu, která se používá pro generování obrázků v PHP, a je vynikající.

// šíř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ákladním generování je výchozí barva pozadí nastavéná jako černá, proto musíme vykreslit bílé pozadí.

$background = imagecolorallocate($img, 255, 255, 255);
// vykreslední pozadí v našem obrázku
imagefilledrectangle($img, 0, 0, $sirka, $vyska, $background);

Je třeba udělat maximum pro to, aby captcha byla nečitelná pro roboty, ale snadno čitelná pro člověka. Začneme vygenerováním náhodných barev, kterými budeme do obrázku vykreslovat písmena 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));
}

Nyní budeme do našeho připraveného obrázku vykreslovat text. Může to působit složitě, ale žádná věda to není. Vše co se týče textu bude generováno náhodně. Všechny možné znaky, které chceme do formuláře vykreslit jsou uložené v poli $znaky. Počet znaků je uložen v proměnné $znaku. Pro barvu písma použijeme naše náhodně vygenerované barvy. Za zmínku stojí, že jsem si uložil font do složky s projektem, a načítám jej do proměnné $font. Pokud chcete použít jakékoliv jiné písmo, stačí změnit hodnotu v proměnné $font. Všechna písma naleznete v operačním systému windows ve složce písma, nebo si je můžete stáhnout např. zde

$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);
}

Teď se podíváme na tu nečitelnost. Vykreslíme na písmo šum. Šum budou tvořit náhodně generované čáry o délce 1 - 4px. Pro barvu použijeme opět naše náhodně generované barvy.

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še captcha je hotová.

Captcha v PHP

Nic složitého to nebylo. Tímto První díl našeho tutoriálu končí. Příště si naši captchu vykreslíme do webového formuláře, a budeme ověřovat, jestli se zadaný text shoduje s textem vykresleným v obrázku. K tomu ale budeme muset výsledný obrázek někam ukládat. My si jej nyní jen vykreslíme do okna prohlížeče, abychom viděli, že kod funguje.

header("content-type: image/jpeg");
imagejpeg($img);

Celý funkční příklad je ke stažení v souboru jako archiv. Funkční příklad si můžete prohlédnout také zde


 

Stáhnout

Staženo 569x (91.7 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (1)

Článek pro vás napsal martinkobelka
Avatar

Jak se ti líbí článek?
Celkem (6 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Ostatní tutoriály v PHP

 

 

Komentáře
Zobrazit starší komentáře (12)

Avatar
albertpatera
Redaktor
Avatar
albertpatera:

mám problém...při aktualizaci se vždy změní pozadí ale písmena se tam neobjeví..font tam danej mám..nevíte co s tim??

 
Odpovědět 21.2.2013 20:24
Avatar
Bitem
Člen
Avatar
Odpovídá na albertpatera
Bitem:

Potřebuješ GD knihovnu na hostingu. Jaký používáš?

Odpovědět 16.11.2013 12:06
Rozdávat rady je zbytečné, chytrý si to najde sám a hlupák si poradit nenechá
Avatar
albertpatera
Redaktor
Avatar
Avatar
Bitem
Člen
Avatar
Odpovídá na albertpatera
Bitem:

To je tím, taky mi to tam nefunguje zkus něco jiného. Třeba http://www.000webhost.com/ tam by to mělo fungovat.

Editováno 16.11.2013 16:37
Odpovědět 16.11.2013 16:37
Rozdávat rady je zbytečné, chytrý si to najde sám a hlupák si poradit nenechá
Avatar
albertpatera
Redaktor
Avatar
 
Odpovědět 16.11.2013 17:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na Bitem
Kit:

Zkusil jsem si http://www.000webhost.com/ , ale nefunguje mi přihlášení na FTP. Asi budu muset ještě chvíli počkat, než se mi to zprovozní.

Odpovědět 16.11.2013 17:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Bitem
Člen
Avatar
Odpovídá na Kit
Bitem:

Bohužel je www.000webhost.com přetížen jak něco tak všechno trvá. Ale myslím že by WebFTP mělo fungovat.

Odpovědět 16.11.2013 17:36
Rozdávat rady je zbytečné, chytrý si to najde sám a hlupák si poradit nenechá
Avatar
Kit
Redaktor
Avatar
Odpovídá na Bitem
Kit:

Už jsem tam. Stačilo změnit heslo. Trochu mě překvapilo PHP 5.2.17 - na svém NTB používám 5.4.21. Mají však PDO a dvě databáze, k tomu XSLT i DOM. To se dá.

Editováno 16.11.2013 17:40
Odpovědět 16.11.2013 17:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Bitem
Člen
Avatar
Odpovídá na Kit
Bitem:

Nebo taky můžeš zkusit http://www.serversfree.com/ mají tam všechno(GD, MySQL, E-mail, PHP atd.) a bez reklam a zdarma

Editováno 16.11.2013 17:48
Odpovědět 16.11.2013 17:48
Rozdávat rady je zbytečné, chytrý si to najde sám a hlupák si poradit nenechá
Avatar
Kit
Redaktor
Avatar
Odpovídá na Bitem
Kit:

Začínám mít pocit, že mých 20 domén zaregistrovaných na různých serverech mi už stačí :)

Odpovědět  +3 16.11.2013 17:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 22. Zobrazit vše