Autor wpisu: batman, dodany: 04.03.2011 08:00, tagi: zend_framework
Najpopularniejszym i póki co najskuteczniejszym zabezpieczeniem przed spamowaniem naszych formularzy jest captcha. Zend Framework, aspirujący do miana najkompletniejszej biblioteki dla języka PHP, dostarcza komponent Zend_Captcha, który w prosty sposób integruje się z formularzem. W kilku prostych krokach jesteśmy w stanie uodpornić nasz formularz na spamujące roboty.
Przed przystąpieniem do konfigurowania captchy, musimy uzbroić się w plik z czcionką, jaka zostanie użyta do utrudnienia życia spamerom. Czcionkę możemy znaleźć np. na stronie Google Web Fonts. Po pobraniu czcionki umieszczamy ją w projekcie. W moim przypadku jest to katalog data znajdujący się na tym samym poziomie co application. Następnie w publicznym katalogu musimy utworzyć katalog na wygenerowane pliki z kodem.
Nadeszła pora na skonfigurowanie captchy.
$captchaImage = new Zend_Captcha_Image(); $captchaImage->setFont(APPLICATION_PATH . '/../data/Kreon-Regular.ttf') ->setFontSize(36) ->setImgDir(APPLICATION_PATH . '/../public/captcha') ->setImgUrl('/captcha') ->setExpiration(90) ->setGcFreq(5) ->setWidth(200) ->setHeight(100) ->setTimeout(60) ->setWordlen(5);
Mimo iż powyższy kod do najpiękniejszych nie należy, doskonale spełnia swoje zadanie. Kolejne metody odpowiadają za:
- setFont – ustawienie czcionki jaka zostanie użyta na obrazku
- setFontSize – ustawienie rozmiaru czcionki
- setImgDir – ustawienie katalogu, w którym będą przechowywane obrazki z kodem
- setImgUrl – ścieżka do obrazków wstawiana do znacznika img
- setExpiration – data ważności wygenerowanych plików
- setGcFreq – ustawienie ilości requestów, po których usunięte zostaną nieaktualne obrazki z kodem
- setWidth, setHeight – ustawienie szerokości i wysokości obrazka z kodem
- setTimeout – ustawienie czasu ważności sesji dla aktualnego obrazka z kodem
- setWordlen – ustawienie ilości liter wyświetlanych na obrazku
Po przebrnięciu przez gąszcz ustawień, możemy przejść do budowania formularza. W tym celu skorzystamy z klasy Zend_Form_Element_Captcha opakowującej stworzą wcześniej captchę w dekoratory formularza oraz ustawiająca odpowiedni walidator.
Całość wygląda następująco.
class Application_Form_Formularz extends Zend_Form { public function init() { $captchaImage = new Zend_Captcha_Image(); $captchaImage->setFont(APPLICATION_PATH . '/../data/Kreon-Regular.ttf') ->setFontSize(36) ->setImgDir(APPLICATION_PATH . '/../public/captcha') ->setImgUrl('/captcha') ->setExpiration(90) ->setGcFreq(5) ->setWidth(200) ->setHeight(100) ->setTimeout(60) ->setWordlen(5); $captcha = new Zend_Form_Element_Captcha( 'txt_captcha', array( 'captcha' => $captchaImage ) ); $this->addElement($captcha); } }
W celach prezentacyjnych ograniczyłem formularz do minimum.
Na koniec ważna uwaga. Jeśli będziecie chcieli modyfikować dekoratory, pamiętajcie, że Zend_Form_Element_Captcha nie korzysta z dekoratora ViewHelper. Zamiast niego należy użyć dekoratora Captcha.