1
Ohodnoť!

Textová 3D Captcha pro Nette Framework

napsal Inza


Po přečtení již poněkud staršího a jistě dobře známého postu Martina Hozíka o tom co je na těch ‚obvyklých‘ captchách špatného, kde mimo jiné představuje myšlenku textové 3D captchy v PHP jsem definitivně dospěl k závěru, že klasickým captchám odzvonilo. A když nedlouho poté publikoval Vítězslav Plachý svoji Captcha form control pro Nette Framework, bylo rozhodnuto.

Oba výše uvedení mě inspirovali a především díky nim přichází na svět Textová 3D Captcha pro Nette Framework

Úvodem

O tom, proč je 3D Captcha lepším a IMHO tím jediným správným řešením captcha otázky píše, jak jsem se již výše zmínil, Martin Hozík na svém blogu a proto bych si dovolil vás, za účelem zodpovězení této otázky, nasměrovat rovnou tam. Já s jeho názorem na tuto otázku zcela souhlasím.

Druhou věcí, kterou chci nyní podotknouti, je fakt, že těmi opravdovými autory této captchi jsou více kluci, než-li já (a co se týče knihovny lineárního vykreslování, či myšlenky na 3D captchu tak, jak sám Martin na svém blogu přiznává, ani on není původním autorem). Já jsem pouze vzal Martinův kód pro vykreslení captchi a Vítězslavovu Captcha control a propojil je dohromady. A přesně tak vznikla tato 3D Captcha.

Ale už dost řečí, pojďme k věci!

Demo:

První co vás asi bude zajímat, je asi online demo:

Funkční online demo.

A tady je screenshot:

3D Captcha s přizpůsobenou barvou textu a pozadí

Download:

Druhou nejdůležitější věcí je download Captchy. 3D Captcha je šířena pod licencí MIT.

Download Captcha 3D Version 0.91

Downloaded a total of 134 times

Použití:

Archiv, který je výše ke stažení, obsahuje 3D Captchu jako komponentu pro Nette Framework, pro znalé jde o Nette FormControl.

Díky tomu 3D Captcha velmi elegantním způsobem spolupracuje s formuláři v Nette Frameworku.

Pokud již znáte, či používáte Vítězslavovu Captcha control, potom jste ve výhodě, neboť použití 3D Captchy je zcela analogické.

Instalace:

Po stažení archivu je z něj nutné přidat do aplikace následující soubory:

  1. V adresáři libs vytvořte pro 3D Captchu nějakou složku, já osobně používám Captcha3D.
  2. Do tohoto adresáře nakopírujte adresáře class/, func/ a resources/ i s jejich obsahem a také soubory Captcha3D.php a Captcha3DCore.php.
  3. V souboru ExamplePresenter.php se nachází příklad použití Captchi ve formuláři některého z vašich již existujících presenterů. Tento soubor nikam nekopírujte. Kdyžtak se můžete podívat dovnitř jak to funguje.
  4. Soubor Captcha3DPresenterExample.php je příkladem presenteru na servírování obrázků, které captcha generuje. Přítomnost tohoto presenteru (resp. jeho kopie přejmenované na Captcha3DPresenter.php a třídy na MODULE_Captcha3DPresenter) je nutné v každé modulu v jehož presenterech je captcha použita. Alternativně lze poupravit kód captchi tak, aby byl tento presenter v některém known modulu v aplikaci pouze jediný – toto by ovšem vytvořilo závislost mezi moduly, proto je výhodnější presentery kopírovat.
  5. Na začátek tovární metody formuláře (nebo někam do startupu BasePresenteru, pokud víme, že budeme Captchu používat často) umístíme kód k otestování existence třídy Captcha3D:
class_exists('Captcha3D');

Nebo alternativně i s vyhozením výjimky v případě neúspěchu:

if(!class_exists('Captcha3D')) // class_exists('Captcha3D') is required, becouse it forces RobotLoader to load Captcha3D class...
        throw new Exception('Unsatisfied Requirement: Captcha3D class not found!');

Tento kód přiměje RobotLoader k indexaci a requirnutí třídy s 3D Captchou, a extenzi jejího připojovátka do třídy formulářů.

Nyní je možné captchu připojovat do všech formulářů pomocí NFFFI.

Příklad použití:

protected function createComponentForm($name) {
        if(!class_exists('Captcha3D')) // class_exists('Captcha3D') is required, becouse it forces RobotLoader to load Captcha3D class...
                throw new Exception('Unsatisfied Requirement: Captcha3D class not found!');

        $form = new AppForm();
        $form->addCaptcha3d('captcha', 'Antispam')
                ->addRule('Captcha3D::validateValid', 'Opište správně písmena z obrázku.');
        $form->addSubmit('send', 'Odeslat')
                ->onClick[] = array($this, 'formSubmitted');
        return $form;
}

Nastavení captchi:

Parametry lze nastavit pomocí NFFFI pro každou instanci zvlášť, nebo přes statické proměnné globálně:

// soubor s použitým písmem
Captcha::$defaultFont = '%libsDir%/Captcha3D/resources/calibri.ttf';

// počet písmen v obrázku - 3D Captcha podporuje maximálně 5 znaků
Captcha::$defaultLength = 5;

// šířka obrázku v pixelech
Captcha::$defaultWidth = 200;

// výšku obrázku svěříme autodetekci
Captcha::$defaultHeight = 0;

// černý text
Captcha::$defaultTextColor = Image::rgb(0, 0, 0);

// na bílém pozadí
Captcha::$defaultBgColor = Image::rgb(255, 255, 255);

// v případě AppForm nastavíme masku odkazu na presenter obrázků
Captcha::$defaultLinkMask = 'Captcha3D:showCaptcha';

Po načtení třídy Captcha3D můžeme použít metodu Form::addCaptcha3d a provést nastavení pomocí NFFFI:

// class_exists("Captcha3D");

$form = new AppForm($this, 'captcha');
$form->addCaptcha3d('captcha', 'Antispam')
        ->setTextColor(Image::rgb(255, 0, 0))
        ->setBgColor(Image::rgb(0, 0, 255))
        ->addRule('Captcha3D::validateValid', 'Opište správně písmena z obrázku.');

Vykreslení captchi:

Před vykreslením můžeme přistupovat k prototypům jednotlivých prvků:

// obalovací div
$container = $form['captcha']->getContainerPrototype();

// HTML element obrázku
$image = $form['captcha']->getImagePrototype();

// textovému poli přidáme třídu 'captcha'
$form['captcha']->getControlPrototype()->class('captcha');

Při postupném vykreslování formuláře lze obrázek a textové pole zpracovat zvlášť:

Obrázek: {!=$form['captcha']->getImage()}
Pole: {!=$form['captcha']->getInput()}

Obojí najednou: {!=$form['captcha']->getControl()}

Nebo jako widget v Nette Frameworku v0.9

{widget form}

FAQ:

Než se budete ptát, vězte:

  • Mohu mít na jednom webu Vítězslavovu Captchu i tvojí 3D Captchu?
    • Ano, captchi spolu nijak nekolidují. Lze je dokonce mít obe v jednom formuláři.
  • Je Captcha závislá na nějakých rozšířeních PHP? Pokud ano tak na jakých?
    • Ano captcha používá jak třídu Nette\Image z Nette Frameworku tak ve svém jádru přímo funkce knihovny GD. Je možné použití Nette\Image zaměnit za Nette\ImageMagick, ale tato úprava je již na vás.
    • Pokud Captcha detekuje, že je knihovna GD kompilována přímo jako součást PHP, automaticky použije nad generovaným obrázkem vyhlazování hran.
  • Lze vzhled Captchi nějak upravit?
    • Ano, dvojím způsobem:
      1. 3D Captcha, stejně jako normální Vítězslavova Captcha control, disponuje možnosti svého nastavení prostřednictvím FFI – Form Fluent Interfaces, jak je tomu zvykem u všech součástí formulářů v Nette Frameworku. Takto lze ovlivnit rozměry captchi, její HTML vlastnosti (id, třídu atd.) barvu textu i pozadí obrázku.
      2. Co se týče nastavení dalších vlastností captchi, zejména úpravy způsobu generování 3D obrázku, ty lze provést manuálně v souboru Captcha3DCore.php, kde se nachází funkce pro samotné generování. Úpravy tohoto druhu však doporučuji pouze skutečně pokročilým uživatelům, neboť je velmi snadné jejich nesprávnou úpravou captchu zcela znehodnotit a znefunkčnit. Také jsou nutné alespoň povrchní znalosti lineárních výpočtů a mapování 2D obrázku na lineární pseudo-3D perspektivu.
  • Kdy a kde mám namapovat volání metody addCaptcha na třídu Nette\Forms\AppForm?
    • Toto namapování je již obsaženo ve třídě Captcha3D, tudíž ji stačí pouze requirnout. Při použití RobotLoaderu stačí provést jednoduchý test na její existenci pomocí funkce class_exists. Toto doporučuji provést buďto lazy cestou v továřničce na formulář a nebo v BasePresenteru, či pokud v aplikaci existuje nějaké hromadný soubor aplikace extension method, tak v něm.

Máte-li jakékoli další otázky či dotazy, neváhejte využít komentářů!

Odkazy:

Jak již bylo řečeno výše, 3D Captcha je založena na základě technologií a informací, které poskytli, či vytvořili:

3D Catcha Control má také svojí stránku na Nette Extras.

Závěrem:

Na závěr chci jen připomenout, především pro ty, kteří Nette Framework zatím nepoužívají, že Nette Framework není nutné použít celý, lze klidně použít pouze knihovnu formulářů. A proto, pokud vás 3D Captcha zaujala a uvažujete nad jejím použitím (a krásným a sexy Nette Forms Fluent interfaces nastavováním), můžete ji společně s formuláři z Nette Frameworku použít i vy! A pokud vás zaujala, ale s Nette Frameworkem zatím nemáte a nechcete mít nic společného, Martin Honzík na svém blogu zveřejnil kód, který captchu generuje a můžete použít ten.

Ať tak, nebo tak, doufám že vás a vaše weby 3D Captcha ochrání před mnohým spamem ;-)

Takže: „Have fun!


Související příspěvky:


Štítky: , , , ,

5 reakcí na “Textová 3D Captcha pro Nette Framework”

  1. HrachNo Gravatar říká :

    Tvá Captcha je moc pěkná, jen trpí takovým hloupým neduhem:
    generuje znaky 1, l, i, ale přitom je „nepovažuje za stejné.“ toto chování je velmi obtěžující, buď tyto znaky považuj za stejné, nebo, prosím, vypni jejich generování. To stejné se radí pro O a 0. Já se nemůžu dostat přes toto

  2. InzaNo Gravatar říká :

    ad Hrach: Díky moc ;-). Online demo jsem zkontroloval a mělo by již být funkční. Jinak ad to generování – Captcha číslice vůbec negeneruje a je case insenzitive. Ale tvá poznámka je správná a již jsem provedl změnu v distribuci.

    Jinak i to, jaká písmena captcha generuje je nastavitelné pomocí konstant Captcha3D::CON­SONANTS pro souhlásky a Captcha3D::VOWELS pro samohlásky.

    Díky za připomínku.

  3. eMuNo Gravatar říká :

    Zdravim!
    3D captcha je hloupost (!), protoze zustava pro roboty stejne dobre citelna jako 2D a vam dava falesny pocit bezpeci. Pouzijte Google a najdete si ukazky, co vsechno a s jakou ucinnosti dokazi stroje precist.

  4. BochiNo Gravatar říká :

    To rádoby 3D je ve výsledku pořád jen 2D a zrovna zobrazený příklad mi přijde hodně průstřelný (stačilo by jen udělat hustotní konturu ve správné úrovni a ten nápis vyleze jako na dlani, jen trochu zkosený).
    Smysl CAPTCHA jsem v postatě nikdy moc nepochopil, vzhledem k tomu, že existují srovnatelně účinné metody, které tak neobtěžují. Například dnes už klasická kontrolní otázka s automatickým předvyplňováním a shováním javascriptem funguje skvěle.

  5. v6akNo Gravatar říká :
    • Pokud se mi nepodaří lousknout kód, nechá mi to hádat znova (více pokusů pro boty)
    • Vypadá to dost deterministicky, myslím, že by se to nelouskalo o moc hůř než O2 CAPTCHA: vygenerovat všechny možné znaky na první pozici a k nim obrázky, porovnat. Pak to stejné s druhou pozicí s tím, že znak na první pozici již bude přidán. A takto by asi šlo pokračovat po všech znacích.

Komentuj to

Než vložíš komentář, měl bys vědět:

  • Komentáře formátuje Texy2
  • Komentáře podporují Gravatary, jestli žádného ještě nemáš, udělej si ho, nebo nafasuješ MonsterID
  • Zdrojové kódy vkládej mezi "/--code" a "\--" - zformátuje a zvýrazní je Texy
  • Více příkladů jak psát sexy v Texy najdeš na webu Texy
  • Neváhej říct svůj názor, kritizovat, nebo se na cokoliv zeptat. Přesně od toho tu komentáře jsou
  • Můžeme si tykat