Mendelova univerzita v Brně Provozně ekonomická fakulta
Webové frameworky a tvorba redakčního systému Bakalářská práce
Vedoucí práce: Ing. Oldřich Trenz, Ph.D.
Michal Lošťák
Brno 2010
Rád bych na tomto místě poděkoval vedoucímu práce Ing. Oldřichu Trenzovi, Ph.D. za cenné rady, konzultace a čas, které mi věnoval.
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně s použitím literatury a podkladů, které jsou uvedeny v práci. V Brně dne 20. května 2010
_______________________
Abstrakt Lošťák, Michal. Web frameworks and creation of content management system. Bachelor thesis. Brno, 2010. This bachelor thesis deals with description and comparison of selected frameworks for scripting language PHP. Comparison is focused on general properties of frameworks. Thesis includes creation of content management system. Keywords PHP, Nette Framework, Zend Framework, Symfony, framework, comparison of frameworks, kontent management system, CMS
Abstrakt Lošťák, Michal. Webové frameworky a tvorba redakčního systému. Bakalářská práce. Brno, 2010. Tato bakalářská práce se zabývá popisem a porovnáním vybraných webových frameworků pro skriptovací jazyk PHP. Porovnání je zaměřeno na obecné vlastnosti. Součástí práce je i tvorba redakčního systému ve vybraném frameworku. Klíčová slova PHP, Nette Framework, Zend Framework, Symfony, framework, srovnání frameworků, redakční systém, CMS
Obsah
5
Obsah 1
Úvod a cíl práce 1.1 1.2
2
7
Úvod................................................................................................................7 Cíl práce ..........................................................................................................7
Analýza současného stavu
9
2.1 Současné technologie a trendy .........................................................................9 2.1.1 PHP a PHP5 ............................................................................................9 2.1.2 AJAX ......................................................................................................9 2.1.3 SEO.......................................................................................................10 2.1.4 Bezpečnost ............................................................................................11 2.2 Frameworky ..................................................................................................13 2.2.1 MVC .....................................................................................................13 2.2.2 Nette Framework...................................................................................14 2.2.3 Zend Framework ...................................................................................17 2.2.4 Symfony................................................................................................19 2.3 Redakční systém............................................................................................20 3
Metodická východiska práce
22
3.1 Porovnání frameworků...................................................................................23 3.1.1 Rychlost ................................................................................................23 3.1.2 Bezpečnost ............................................................................................25 3.1.3 Komunita ..............................................................................................26 3.1.4 Technologie...........................................................................................27 3.1.5 Vývoj ....................................................................................................28 3.1.6 Dokumentace ........................................................................................28 3.2 Vyhodnocení .................................................................................................29 4
Realizace redakčního systému 4.1 4.2 4.3 4.4 4.5 4.6
5
Struktura aplikace ..........................................................................................32 Datová struktura ............................................................................................35 Zabezpečení...................................................................................................36 Přívětivé prostředí..........................................................................................38 SEO...............................................................................................................39 Menu .............................................................................................................40
Diskuze a závěr 5.1 5.2
31
42
Diskuze .........................................................................................................42 Závěr .............................................................................................................42
Literatura
44
Obsah
6
Přílohy
47
A Třída Authenticator
48
Úvod a cíl práce
7
1 Úvod a cíl práce 1.1
Úvod
Úvod do problematiky práce lze začít jednoduchou otázkou, která je také podobná názvu jednoho z článků Davida Grudla, hlavního vývojáře Nette Frameworku. Ona otázka zní: „Jak snadno a rychle psát špičkové webové aplikace?“. Podobnou otázku si jistě pokládá většina tvůrců jakýchkoliv webových aplikací. Ať už jde o jednoduchý statický web či rozsáhlý systém, je cílem každého vývojáře odvést kvalitní práci s vynaložením co nejmenšího úsilí. I když člověk píše primitivní či složitou aplikaci, téměř vždy se dostane do situace, kdy použije pro něj již známý kód, který použil na desítkách jiných aplikací. V takové chvíli má na výběr ze dvou možností, buď po sto první napíše onen známý kód a nebo se rozhodne napsat určitou šablonu, kterou by mohl příště namísto opětovného vypisování použít. Ve výsledku složením několika takových šablon dohromady, může vývojář i nevědomky vytvořit svůj malý framework. Od samotného zavedení HTML jazyka uplynula dlouhá doba a dnešní vývojář webových aplikací má na výběr ze spousty technologií, ať už jde například o PHP, CSS, AJAX, XML a další, které zdokonalují webové prostředí tak, aby se co nejvíce podobalo tomu desktopovému. Jelikož technologií existují již spousty, je v poslední době trendem, brát zřetel na eleganci s jakou je systém napsán. Zpátky tedy k otázce citované na počátku textu, právě framework by měl být tím správným pomocníkem k rychlému napsání špičkové aplikace. Pokud chce vývojář s frameworky začít, má na výběr z celé řady kvalitních frameworků, z nichž ty známější a rozšířenější budou v práci představeny a detailněji popsány. Mezi těmito frameworky bude i jeden mladý, ambiciózní, český zástupce, který se v českých končinách v posledních letech rozšířil a hodně se o něm mluví. O tomto frameworku jeho autoři prohlašují, že je jeden z nejbezpečnějších frameworků vůbec.
1.2
Cíl práce
Cílem práce je posoudit použitelnost Nette Frameworku v praktických aplikacích a porovnat ho s obdobnými řešeními. V součinnosti s cílem práce bude součástí řešení i testování hypotézy, že Nette Framework je nejlepším dostupným řešením pro zabezpečení aplikace.
Úvod a cíl práce
8
K dosažení cíle je využito porovnány obecných vlastností dvou známých a rozšířených frameworků a spolu s nimi vlastnosti právě Nette Frameworku. Na základě porovnání jsou určeny nedostatky či slabiny Nette Frameworku oproti zaběhlým konkurentům. Samotná praktická použitelnost Nette Frameworku je demonstrována na tvorbě redakčního systému, protože v současné chvíli neexistuje oficiálně vydaný redakční systém, který by byl postaven právě na tomto frameworku. Výsledný redakční systém má obsahovat základní funkčnosti redakčního systému, ale především má být kostrou připravenou pro další rozšiřování a také pro ostré nasazení v praxi.
Analýza současného stavu
9
2 Analýza současného stavu Prvně je potřeba zdůraznit, že se práce soustředí na webové prostředí a právě proto se zabývá frameworky založenými na PHP. Aby mohl být vůbec nějaký framework posuzován z jakéhokoliv hlediska, je nutné se napřed zamyslet nad tím, co je od něj očekáváno. Framework využitelný v praxi, musí mít zajištěný takový vývoj, aby šel ruku v ruce s vývojem standardů, které se běžně na webu a při tvoření internetových aplikací využívají. Je proto nutné se alespoň okrajově zmínit o prvcích, které se od každého použitelného frameworku očekávají. Většinou jde o velice rozšířené a známé technologie, proto není potřeba je nikterak detailně rozebírat, stačí jen uvést základní informace a jejich současná rozšíření. Představeny budou také frameworky, které se musí lépe či hůře s těmito technologiemi vypořádat.
2.1 2.1.1
Současné technologie a trendy PHP a PHP5
Původně tato zkratka znamenala Personal Home Page, čili osobní domácí stránky. S rostoucí oblibou tohoto jazyka došlo ke změně a dnes už je známý jako Hypertext Preprocesor. Jedná se o skriptovací jazyk určený především k programování internetových aplikací. Úplně na začátku tohoto jazyka stál jednoduchý skript, který počítal přístupy na stránky. Ohlasy uživatelů byly ale tak silné, že autor začal s postupným rozšiřováním o další funkce, které daly za vznik jazyku tak jak ho známe dnes. Jeho úspěch je dán především tím, že je šířen bezplatně a není vázán na žádnou konkrétní platformu. V současnosti je nejnovější verzí PHP 5, přesněji PHP 5.3, která výrazně zdokonalila výbavu pro objektově orientované programování, umožňuje využití zpracování výjimek. Dále podporuje SQLite a byl zdokonalen systém zpracování řetězců a podpora XML a webových služeb. Od verze 5.3. navíc PHP podporuje jmenné prostory. (Gilmore, 2007) (PHP Group, 2001) 2.1.2
AJAX
Ačkoliv prvopočátek tohoto pojmu sahá mnohem dál, první zmínka o AJAXu pochází z článku Jesse Jamese Garretta. Ve svém článku poukázal na skutečnost, že rychlost rozvoje webu současně zapříčinila propast mezi možnostmi, které uživateli mohou po-
Analýza současného stavu
10
skytnout webové a desktopové aplikace. Navzdory této skutečnosti se v posledních letech tato mezera zaceluje a to právě díky AJAXu. Slovo AJAX je zkratkou Asynchronous JavaScript and XML. Souhrnně se dá o AJAXu říci, že je to technologie umožňující, aby tok dat mezi uživatelem a serverem běžel na pozadí v reálném čase a nemusel čekat na událost, která to odstartuje. To znamená, že obsah stránek se může měnit bez toho, aby se musela celá stránka znovu načítat. Ačkoli by se mohlo zdát, že jde o jednu konkrétní technologii, skutečnost je trochu jiná. AJAX představuje kolekci technologií a to konkrétně XMLHttpRequest, což je speciální objekt dostupný ve všech moderních prohlížečích, který umožňuje připojení na server a zpracovávání jeho odpovědí na pozadí. Dále JavaScript, který obstarává připojení na server a zpracovává jeho data. A XML, které představuje jednu z možností v jaké formě se mají zpracovat data zaslaná serverem. (Holzner, 2007) (Garretta, 2005) 2.1.3
SEO
Jde o anglickou zkratku slov Search Engine Optimization, což v překladu znamená optimalizace pro vyhledávače. Nejedná se o žádnou technologii nýbrž o určitou sbírku rad a doporučení jak dělat webové aplikace tak, aby byly pro vyhledávače snadněji nalezitelné. Pokud o sobě nebo o své firmě chce v dnešní době dát člověk vědět, musí být na internetu. Ovšem ze všech informací, které na internetu již jsou je dosti obtížné dosáhnout toho, aby potencionální návštěvníci našli právě tyto stránky. SEO má dopomoci k tomu, aby se tato šance radikálně zvýšila. Problematika SEO je značně rozsáhlá, některé postupy však budou dále využity a proto základní informace o nich budou objasněny již zde. (Grappone, Couzin, 2007) Jak již bylo řečeno SEO se týká stavby celého webu a způsobu jeho napsání, proto prvotním předpokladem pro vyhledatelné stránky je jejich validita, čili čistota kódu. Dalším důležitým prvkem jsou klíčová slova. Jde o slova, která by měla co nejvíce vystihovat skutečnosti, které se na webu nachází a podle kterých uživatel bude stránky hledat. Při tvorbě aplikace je třeba brát zřetel na to, aby se klíčová slova vyskytovala na webu co nejvíce. K tomu vývojáři kromě textu může posloužit mimo jiné také URL adresa. Je tedy vhodné, aby aplikace využívala takzvané pěkné URL, což znamená, že ve všech adresách stránek se budou zobrazovat slova a ne hodnoty momentálních proměnných. Dalším důležitým místem pro vložení těchto slov jsou tagy title. Zřetel je
Analýza současného stavu
11
třeba brát i na posloupnost nadpisů vyskytujících se na stránkách. (Darie, Sirovich, 2007)
Obr. 1
Pěkná a škaredá URL adresa
Poslední důležitou vlastností webu je aktualizace obsahu. Stránky, na kterých se mění text jednou za rok nemohou být pro vyhledávače zajímavé. Roboti vyhledávačů zkoumají jak často je web aktualizován a podle toho opět stoupá v jejich žebříčku. Pokud člověk píše statické stránky je taková aktualizace poměrně pracná. Pomůckou pro aktualizaci může být redakční systém. 2.1.4
Bezpečnost
Při psaní jakýchkoliv dnešních webových aplikací je třeba brát velký zřetel na jejich bezpečnost. Zanedbání této stránky může způsobit v lepším případě umístění škodlivého kódu na stránky, ale může dojít i ke ztrátě dat či kompletnímu smazání stránek. Metod, které umožňují nabourání se do systému je spousty, zde jsou uvedeny některé často užívané. XSS Cross-site scripting je metoda narušení webových stránek zneužívající neošetřených výstupů. Útočník pak dokáže do stránky podstrčit svůj vlastní kód a tím může stránku pozměnit nebo dokonce získat citlivé údaje o návštěvnících. Proti XSS se lze bránit jen důsledným a korektním ošetřením všech řetězců. Přitom stačí, aby programátor jen jednou jedinkrát toto opomenul, a celý web může být rázem kompromitován. (Huseby, 2004) CSRF Cross-site request forgery je útok spočívající v tom, že útočník přiměje uživatele navštívit stránku, která skrytě vykoná útok na webovou aplikaci, kde je uživatel zrovna přihlášen. Lze tak například pozměnit nebo smazat článek, aniž by si toho uživatel všiml.
Analýza současného stavu
12
Proti útoku se lze bránit generováním a ověřováním autorizačního tokenu. (Nette Foundation, 2009) URL attack, control codes, invalid UTF-8 Tyto pojmy souvisejí se snahou útočníka podstrčit webové aplikaci škodlivý vstup. Následky mohou být velmi různorodé, od poškození XML výstupů (např. nefunkční RSS kanály) až po získání citlivých informací z databáze nebo hesel. Obranou je důsledné ošetřování všech vstupů na úrovni jednotlivých bajtů. Například invalid UTF-8 je problém, kdy bajtová posloupnost znaků netvoří validní UTF-8 řetězce. Pokud by se například použil v SQL příkazu u databáze MySQL, ta by vyhodila chybu #1300 Invalid utf8 character string. Naopak SQLite, která kontrolu kódování neprovádí, by jej akceptovala a mohl by se zavléci dovnitř datového modulu aplikace. Pokud se takový řetězec dostane na výstup, způsobí selhání XML parserů (tj. web by generoval např. nevalidní RSS výstupy) a podobně. (Huseby, 2004) Session hijacking, session stealing, session fixation Se správou session je spojeno hned několik typů útoků. Útočník buď zcizí anebo podstrčí uživateli své session ID a díky tomu získá přístup do webové aplikace, aniž by znal heslo uživatele. Poté může v aplikaci provádět cokoliv, aniž by o tom uživatel věděl. Obrana spočívá ve správném nakonfigurování serveru a PHP. (Shiflett, 2005) SQL injection Tento bezpečnostní problém se týká napadení přímo databáze. Obzvláště začínající programátoři sílu SQL injection podceňují. Útočník se tak může dostat do databáze a upravovat data, či v horším případě smazat některou z tabulek. Technika spočívá v tom, že díky neošetřenému vstupu, ať už ve formuláři nebo v URL, útočník upraví zasílaný SQL dotaz, který je následně vykonán. Nejjednodušší ochranou proti tomuto útoku je nastavení oprávnění k tabulkám nebo ošetření potenciálně nebezpečných znaků na vstupu. (Huseby, 2004)
Analýza současného stavu
2.2
13
Frameworky
Ačkoli je frameworků celá řada, ty které jsou uvedeny dále v práci představují známé a uživatelsky rozšířené zástupce. V této kapitole jsou představeny základní informace o jednotlivých frameworcích a o vlastnostech, které jim přisuzují jejich tvůrci. Jedná se tedy o předpokládané vlastnosti jednotlivých frameworků. V úvodu bylo nastíněno co přibližně framework je, nyní bude tento pojem detailněji popsán. Základní vlastností frameworku je usnadnit práci programátorům. Konkrétně to dělá tak, že obsahuje předem předpřipravené sady kódů, určené přímo pro vykonávání základní funkcionality aplikace či některé její části. Aplikace může využívat buďto celý framework a nebo využívá konkrétní knihovnu pro práci jen s určitou skupinou funkcí. Toto komplexní nebo částečné užití frameworku je i jejich základním členěním. Frameworky jsou buď rozděleny na jednotlivé skripty vykonávající konkrétní činnost a nebo je celý framework jedna velká knihovna obsahující kompletní sadu funkcí a nasazuje se jako celek kvůli jejich provázanosti. Ať už si vývojář vybere z první či druhé skupiny, framework by měl převzít řešení typických problémů pro danou oblast řešení a vývojář se může soustředit na vývoj aplikace samotné. Další výhodou frameworků je, že jsou na ně vázány volné licence tudíž jejich užití je bezplatné a v případě potřeby si může programátor kódy upravovat dle potřeby nebo přidávat nové funkce dle libosti. (McArthur, 2008) 2.2.1
MVC
S pojmem framework souvisí úzce ještě další pojem, kterým je MVC. MVC je zkratkou slov Model, View, Controller což je softwarová architektura, rozdělující aplikaci do třech samostatných částí, vrstev. Jsou to vrstvy datová, uživatelská a řídící. Výhodou této architektury je, že minimalizuje míru ovlivnění jedné vrstvy, úpravou vrstvy druhé. V praxi je MVC realizováno rozdělením jednotlivých částí na komponenty nebo moduly, které mohou být současně upravovány, což výrazně usnadňuje a urychluje práci v týmech. Také je potřeba zdůraznit, že problematika MVC je poněkud složitější a existuje na ni několik různorodých pohledů. Každý programátor si architekturu MVC vykládá po svém a proto je tento pojem předmětem mnoha diskuzí bez jednoznačného výsledku.
Analýza současného stavu
14
Pojem MVC je zde zmíněn proto, protože dále popisované frameworky tuto architekturu používají nebo z ní alespoň vychází. Model Model je funkčním a datovým základem celé aplikace. Poskytuje prostředky jak pro přístup k datové základně a stavům aplikace, tak pro jejich ukládání a aktualizaci. Hovoří se o něm jako o softwarovém obrazu procesů reálného světa. Měl by být jako celek zapouzdřený a pro View a Controller nabízet přesně definované rozhraní. Nejčastěji je implementován pomocí objektových tříd, lze jej však (v přístupech odlišných od OOP) realizovat například i běžnými funkcemi. Na své nižší vrstvě je samozřejmě tvořen nějakou formou úložiště dat. (Sweat, 2005) View View zobrazuje obsah Modelu, zajišťuje grafický či jiný výstup aplikace. Přes Model přistupuje k datům a stavům aplikace a specifikuje, jak mají být prezentovány. Při změně stavu Modelu aktualizuje zobrazení. U webových aplikací generuje View příslušný HTML kód, který je odeslán prohlížeči jako odpověď na požadavek. Jestliže slouží zobrazený výstup zároveň jako oblast pro zachytávání událostí od uživatele (například kliknutí myší do vykresleného okna), předává View tyto události Controlleru. (Sweat, 2005) Controller Controller definuje chování aplikace. Zpracovává veškeré vstupy a události pocházející od uživatele. Na jejich základě volá příslušné procesy Modelu, mění jeho stav apod. Podle událostí přijatých od uživatele i podle výsledků akcí v Modelu pak vybírá Controller vhodné View pro další zobrazení. Pro webové aplikace jsou hlavním vstupem HTTP GET nebo POST požadavky odeslané uživatelovým prohlížečem. (Sweat, 2005) 2.2.2
Nette Framework
Tento framework vznikl v roce 2004. Pro veřejnost byl ale v tichosti uveřejněn až v roce 2008, čili se dá říci, že se jedná o poměrně nový produkt. Původním autorem tohoto díla je vývojář David Grudl. O další vývoj se stará Nette Foundation s Grudlem v čele. Jak je tedy patrné, jedná se o český framework, který tak jak tomu už u fra-
Analýza současného stavu
15
meworků bývá, je uvolněn a šířen pod volnou licencí a je tedy naprosto bezplatný. Konkrétně se jedná o kombinaci GNU GPL a Nette licence, která vychází z BSD licence. Nette Framework je tedy volně šiřitelný a může být určen i ke komerčním účelům. V podstatě jedinou podmínkou, kterou licence uděluje pro nekomerční využití je uvést u vyvíjené aplikace autora Nette Frameworku a připojit kopii této licence. O Nette Frameworku se hovoří jako o nejbezpečnějším frameworku. Mezi českými vývojáři se o Nette Frameworku hodně mluví a jeho potenciál je patrný i například z ocenění 2. nejlepší český software roku 2009. Současná verze frameworku nese označení 1.0. Laděnka Laděnka je jediná knihovna, která bude v práci uvedena, protože je samotným autorem považována za důležitou vlastnost Nette Frameworku. Jedná se konkrétně o knihovnu Nette/Debug. Ta se aktivuje jednoduchým zavoláním Debug::enable();. Laděnka poskytuje vývojáři informaci o tom, kde a proč se vyskytla nějaká chyba. Toto sice dokáže i samotné PHP, ale to proč má význam o laděnce vůbec mluvit může být patrné z následujícího obrázku.
Obr. 2
Laděnka z nette nalevo a php hláška napravo
Jak je vidět, hlášení laděnky je o poznání přehlednější a navíc podává vývojáři mnohem více informací. Laděnka také automaticky rozpozná zda běží na produkčním či vývojovém serveru a podle toho se chová. V případě vývojového serveru vypisuje všechny informace o chybě. Na produkčním serveru je tato vlastnost nežádoucí, a proto chyby loguje a případně posílá pouze informaci na email. Laděnka také umožňuje zapnutí striktnějšího módu, kdy zobrazuje informace i o chybách nižších úrovní. Pro zobrazování obsahu proměnných může vývojář využít funkci dump a pro měření času odezvy v řádu mikrosekund jsou k dispozici stopky, čili funkce timer. (Grudl, 2009)
Analýza současného stavu
16
2.2.2.1 Dibi Dibi je minimalistický databázový layer1, obsahující ovladače pro osm různých databází. Jsou to MySQL, MySQLi, PostgreSQL, SQLite, ODBC a experimentální MS SQL, Oracle a PDO. Na vývoji dibi se podílí stejná skupina lidí jako na Nette Frameworku, proto jsou oba produkty plně kompatibilní a jsou šířeny pod podobnou licencí. Pokud vývojář začne s Nette Frameworkem pracovat, brzy začne využívat i možností dibi, které práci v rámci modelu velice usnadňuje. Dibi zapouzdřuje funkce do intuitivního objektově orientovaného rozhraní, využívající možnosti PHP 5. Dále asistuje při psaní selektů do databází a to tak, že jsou selekty rychlé a přehledné. Dibi automaticky uvozuje identifikátory a řetězce a konvertuje typy boolean či date do formátu databáze. Velmi silnou stránkou dibi je jeho asistence při výpisů dotazů pomocí nenápadných metod fetchPairs() a fetchAssoc(). FetchPairs jednoduše vrací výsledek ve formě asociativního pole, kde umožňuje k prvkům tradičně přistupovat pomocí key => value. Metoda fetchAssoc velice zpřehledňuje a ulehčuje práci s výsledky dotazů, které pracují s více tabulkami spojenými různými vazbami. Dibi je také přirozeně zabezpečeno proti SQL injection takže pomáhá chránit aplikaci. Ochrana je zajištěna modifikátory uvedenými v dotazu takže databáze dostává data převedená do formátu a pravidel aktivní databáze. Pokud v dotazu není modifikátor uveden, dibi rozpozná parametr automaticky. (Grudl, 2007) MVP vs MVC Pojem MVC byl již popsán, ovšem Nette Framework se na MVC dívá pouze jako na duševně spřízněnou architekturu. Struktura Nette Frameworku se spíše podobá vzoru MVP. Struktura MVP obsahuje stejné moduly čili model a view, ale controller nahrazuje presenterem. Opět i problematika této architektury není jednoznačně vyřešena a záleží na individuálním chápání. MVP rozděluje funkce následovně – Model představuje komponenty pracující přímo s daty nebo data samotná. View reprezentuje tato data ve 1
Jedná se o aplikační programové rozhraní, které zajišťuje komunikaci mezi počítačovou aplikací a data-
bází. Jelikož každá databáze má svůj vlastní přístup ke komunikaci, vývojář nemůže vytvořit univerzální kód kompatibilní se všemi databázemi, které by rád použil. Pro překonání tohoto omezení existuje právě Databázová vrstva, kterou si může vývojář navrhnout přímo pro své potřeby. (Nette Foundation, 2009)
Analýza současného stavu
17
formě výstupů a získává vstupy od uživatele. Presenter vyhodnocuje přímo požadavky na aplikaci a spouští konkrétní moduly modelu, které jsou potřeba. Tím pádem presenter přejímá správu nad aplikační a prezenční logikou a jsou od sebe odděleny view a model. (Potel, 1996)
Obr. 3
Architektura MVP v Nette, zdroj: http://zdrojak.root.cz/clanky/nette-framework-mvc--mvp/
2.2.3
Zend Framework
Tento framework je vyvíjen od roku 2005 společností Zend Technologies Ltd., a světlo světa spatřil v roce 2007, kdy byla oficiálně vydána prví finální verze. Podobně jako Nette Framework je uvolněn pod svobodnou licencí BSD takže je zcela bezplatný i pro komerční využití. Od doby vydání první verze tento framework urazil dlouhou cestu a na poli frameworků se jedná o klíčového hráče s početnou základnou uživatelů i vývojářů po celém světě. Na samotném vývoji se podílí přes 300 programátorů. Stejně jako Nette Framework je tento framework tvořen jednotlivými komponentami, knihovnami, kde každá plní svůj samostatný účel a nebo dohromady komplexní celek pro tvorbu aplikací. Architektura Zend Frameworku je založena na již zmíněné struktuře MVC. Záměrem tvůrců Zend Frameworku bylo především vytvořit nástroj pro vývojáře, který bude klást mimořádný důraz na objektově orientované programování. Veškeré komponenty Zend Frameworku jsou zpětně kompatibilní a mají řádnou a přehlednou dokumentaci. Současná verze frameworku nese označení 1.10.4. (Zend, 2006)
Analýza současného stavu
18
Bezchybovost Jednou ze základních vlastností, kterou se Zend Framework pyšní, je jeho bezchybovost. Samozřejmě to neznamená, že se v Zend Frameworku nevyskytuje jediná chyba, ale spíše to, že se tvůrci snaží o maximální eliminaci chyb. Každému vydání nové verze frameworku předchází rozsáhlé zkoumání a testování nových komponent. Než je přidána jakákoliv nová část tak je nejprve řádně testována pomocí PHPunit a dokud nejsou odstraněny všechny vážnější chyby tak není komponenta do nové verze frameworku přidána. Složitým rozhodováním také prochází jakákoliv myšlenka na přidání některé nové komponenty, tím pádem se do nové verze dostanou jen ty opravdu dobrá a potřebná vylepšení. (Brown, Allen, Lo, 2008) Databáze Práci s daty, čili s databázemi obstarává třída Zend_db. Pro připojení k databázi se využívá konkrétně adaptéru Zend_db_adapter. Tento adaptér umí spolupracovat s databázemi IBM DB2, MySQLi, Oracle, PDO pro IBM DB2 a Informix, PDO MSSQL, PDO MySQL, PDO Oracle, PDO PostgreSQL, PDO SQLite a Firebird. (Zend, 2006) Komponenty Díky tomu, že Zend Framework se již na poli frameworků pohybuje delší dobu s početnou základnou uživatelů, má vytvořenou rozsáhlou knihovnu jednotlivých komponent. Pro představu například vlastní šablonovaní systém, možnosti lokalizace do různých jazyků (formátování dat, čísel), komponenty pro správu autentizace, práce s elektronickou poštou, a spousty dalších. (Brown, Allen, Lo, 2008) PHP Další jednoznačnou výhodou tohoto frameworku je, že lidé podílející se na jeho vývoji se značně podíleli a někteří i dále podílejí na vývoji samotného PHP, na kterém je Zend Framework i další, založen. Díky tomu může rychleji reagovat na změny a novinky v samotném PHP a získávat tak konkurenční výhodu oprati ostatním frameworkům.
Analýza současného stavu
2.2.4
19
Symfony
Posledním zástupcem frameworků, který bude v práci zmíněn je Symfony. Původně se jmenovalo Sensio framework protože bylo vyvíjeno pro účely společnosti Sensio Labs. S vývojem začal v roce 2003 vývojář Fabien Potencier ve snaze vytvořit svůj vlastní open source systém. Jádro, které vytvořil vycházelo ze struktury MVC frameworku Mojavi, objektově relačního mapování Propel a šablonovacího systému převzatého z Ruby on Rais. První verze Symfony vyšla v roce 2005 a společně s touto verzí vznikl i oficiální portál frameworku, díky kterému začal získávat na věhlasu. V současné chvíli se čeká na vydání další verze, a to 2.0. Aktuální verzí je Symfony 1.4, které, ale zatím podporuje pouze PHP 5.2.4. Symfony je také vydáváno pod svobodnou licencí a to konkrétně MIT, která podobně jako BSD umožňuje i komerční využití pod podmínkou uvedení kopie licence v kódu. Samotný framework využívá několika externích komponent jako například již zmíněný Prado framework pro podporu lokalizace, Creole databázovou aplikační vrstvu, Pake command-line interpret a další. Dokonce využívá i některé komponenty Zend frameworku. Symfony bylo revoluční především v době svého vzniku, protože v sobě integrovalo všechny dostupné nástroje, které byly na dostatečné úrovni vývoje. Dále díky kvalitnímu kódu a rozsáhlé dokumentaci mělo výhodu oproti konkurenci. V současnosti nepřináší žádnou revoluční novinku, jen si stále drží původní vizi a tou je umožnit rychlé a výkonné vyvíjení aplikací se snadnější správou. (Potencier, Zaninotto, 2007) YAML YAML je akronym pro YAML Ain´t Markup Language což je přímočaře, strojově zpracovatelný formát na serializaci dat, který je navržen jako čitelný pro člověka a schopný interakce se skriptovacími jazyky. Je to tedy jazyk podobný XML, který dokáže popsat data podobně jako XML, ale s mnohem jednodušší syntaxí. Díky rychlosti a jednoduchosti YAML Symfony preferuje právě tento jazyk před XML, ale samozřejmě to neznamená, že by XML nepodporovalo. V YAML souborech například Symfony uchovává konfiguraci. (Potencier, Zaninotto, 2007)
Analýza současného stavu
Obr. 4
20
Ukázka struktury v XML a v YAMLu, zdroj: Rybák, Kotačka
Příkazový řádek Možnost spravovat aplikaci z příkazové řádky je podle tvůrců tohoto frameworku alfou a omegou Symfony. Je to také vlastnost, která jej odlišuje od ostatních PHP frameworků. Pomocí několika jednoduchých příkazů si může programátor vytvořit celou strukturu budoucí aplikace a předdefinovat velké množství kódu, což ušetří spoustu času. Příkladem může být příkaz pro zesynchronizování produkčního a vývojového prostředí, vytvoření databáze z již existujícího schématu či spouštění testů aplikace.(Rybák, Kotačka, 2007) Konfigurace Využití YAML v symfony má ještě jeden velký význam. Symfony se vyznačuje vysokou mírou konfiguratelnosti dle potřeb vývojáře. Všechno co se dá jakýmkoliv způsobem nastavovat je v tomto frameworku odděleno od kódu a ukládá se do YAML souborů. Někdy tedy dokonce může nastat situace, kdy programátor pouze nastavuje a k programování se ani nedostane. Do YAML souborů jde vkládat i PHP kód pro případ doplnění konfiguračního souboru. Uživatel si může nastavit spousty vlastností, pro představu namátkou například cache, postředí databáze, pomocné třídy, logování, routování, zabezpečení nebo třeba nastavení prezentační vrstvy. (Rybák, Kotačka, 2007)
2.3
Redakční systém
Redakční systém neboli CMS(content management system) je webová aplikace sloužící k podpoře publikační činnosti. Zpravidla se jedná o prostředí, umožňující tvorbu a publikaci dokumentů online přes webové rozhraní. Tento popis, ale vystihuje pouze základ-
Analýza současného stavu
21
ní funkčnost systému. CMS systémy zpravidla nabízejí rozsáhlejší sadu funkcí podle potřeby zákazníka, jelikož je v zájmu dodavatele webové aplikace i jeho klienta, aby po vytvoření prezentace na internetu mohl zákazník sám co nejvíce spravovat svůj systém. CMS proto může obsahovat funkce pro základní správu takové prezentace. Uživatel si pak může sám upravovat například položky menu, aniž by platil dodatečné úpravy dodavateli. (Konečný, 2006) Redakční systémy jsou obvykle členěny na veřejnou sekci a uživatelskou (nebo také administrátorskou a uživatelskou sekci). Toto členění od sebe odděluje část, kde administrátor vkládá články, které jsou potom v uživatelské sekci veřejně každému dostupné. S tímto rozdělením souvisí i další vlastnost a to rozdělení uživatelů dle pravomocí. Je nežádoucí, aby každý uživatel dle libosti mohl upravovat strukturu webu a proto jsou uživatelům rozdány pravomoce dle toho, jakou funkci na webu zastávají. Obvykle existuje super uživatel admin, který může tato oprávnění přidělovat, pak řadový uživatelé, kteří přes systém například spravují svou mailovou schránku, a v neposlední řadě redaktor, který má oprávnění přidávat texty na web a upravovat je. (Macháň, 2003) Známým zástupcem redakčního systému je open source systém DRUPAL, který obsluhuje například stránky prezidenta Baraka Obamy.
Metodická východiska práce
22
3 Metodická východiska práce Pokud chce vývojář začít pracovat v některém frameworku a nemá dosavadní zkušenost, existuje několik obecných vlastností, které bude zkoumat. Ve většině případů se dříve seznámí s určitou přidanou hodnotou frameworku než samotným kódem, třídami a komponentami. Touto přidanou hodnotou může například být přehledná a kompletní dokumentace, aktivní komunita a další. Tyto hodnoty budou také předmětem samotného porovnávání. Pro účely práce jsou zvolena tato kritéria:
Rychlost
Bezpečnost
Komunita
Technologie
Vývoj
Dokumentace
Měření rychlosti bude prováděno na jednoduchém výpisu textu a na základních operacích nad databází. Postup měření vychází z obdobného měření Zdeňka Havlína z České zemědělské univerzity v Praze, které provedl v rámci své bakalářské práce. Autor vždy prováděl dvě měření. První s vypnutým nástrojem pro optimalizaci a cachování a druhé se zapnutým nástrojem. Autor dále rozdělil měření na pět částí, kdy v první vypisoval jednoduchou stránku ,,Hello World“, a dále prováděl dotazy nad databází Select, Insert, Update a Delete, kdy každé měření prováděl 30x za sebou. Bezpečnost sice není obecnou vlastností frameworků, ale pro potřeby této práce je vhodné doplnit i toto kritérium. Cílem tohoto posuzování je posoudit hypotézu o bezpečnosti Nette Frameworku. Velice důležitým zdrojem informací je komunita. Do komunity patří oficiální i neoficiální fóra, články, blogy a další zdroje informací. Díky komunitě se člověk nejčastěji, v tomto případě o frameworku, dozvídá. Technologie byly uvedeny v předchozí kapitole. Framework, který nepodporuje současné technologie užívané v internetovém prostředí je v praxi jen těžko použitelný. Ačkoli vývoj úzce souvisí s technologiemi, je brán jako samostatné kritérium k posuzování. Ve vývoji může být posuzováno to, jak rychle jsou nové technologie zakom-
Metodická východiska práce
23
ponovány či zda dochází k revizím aktuálních verzí frameworků, nebo je veškeré úsilí soustředěno na pouze nové verze frameworku. Dobře napsaná dokumentace je dalším prvkem, který uživatele přiměje zvolit si některý framework. Pokud se uživatel seznamuje s frameworkem a jeho prostředím, tak dokumentace je první místo se kterým přijde do styku. Dokumentace by měla být aktuální a věcná. Na základě těchto vlastností se uživatel nejčastěji rozhoduje pro konkrétní framework. Cílem tohoto zkoumání je, zjistit, zda Nette Framework přes své mládí nabízí uživatelům podobné zázemí jako vybrané světoznámé frameworky.
3.1 3.1.1
Porovnání frameworků Rychlost
Naměřené rychlosti vykonání instrukce každého frameworku znázorňují následující grafy. Číselné hodnoty představují čas v mikrosekundách. Barevně jsou rozlišeny hodnoty se zapnutým eAcceleratorem a s vypnutým eAcceleratorem. Samotné PHP dosáhlo hodnot 13ms, 22ms, 18ms, 25ms a 14ms.
Metodická východiska práce
24
Nette Framework 200
189
150 137
137 120
čas [ms]
132
125
100 76 60
58
58
50
0 Hello World
Insert
Select
eAccelerator vypnutý
Obr. 5
Update
Delete
eAccelerator zapnutý
Souhrnné porovnání, doba zpracování skriptu v Nette Frameworku
Zend Framework 250
198
200 174 163
150 čas [ms]
150 130 115 100 76
74 65
55 50
0 Hello World
Insert
Select
eAccelerator vypnutý
Update
eAccelerator zapnutý
Delete
Metodická východiska práce
Obr. 6
25
Souhrnné zpracování skriptu v Zend Frameworku
Symfony 250 225
200 175 165 150 150
145
čas [ms]
140
100 100 83
79 69
50
0 Hello World
Insert
Select
eAccelerator vypnutý
Obr. 7
Souhrnné zpracování skriptu v Symfony
3.1.2
Bezpečnost
Update
Delete
eAccelerator zapnutý
Nette Framework Nette Framework nabízí hned několik prvků ochrany aplikace. Context-aware escaping je technologie, která eliminuje rizika cross-site scriptingu. Jelikož toto bezpečnostní riziko je dáno především nepozorností programátora, Nette Framework pomocí contextaware escapingu automaticky kontroluje a případně ošetřuje všechny výstupy. Automaticky tedy nahrazuje veškeré nebezpečné znaky za příslušné HTML entity, které nedovolují útočníkovi vložit škodlivý kód na web. Ochranu před cross-site request forgery vykonává Nette Framework velice snadno. K formuláři stačí připojit kód $form->addProtection(); a stává se chráněným. Tato funkce vygeneruje unikátní kód, který útočník nedokáže zfingovat. Kód bude připojen na skryté pole formuláře a jeho hodnota vznikne složením session doplněné o takzvaný autorizační token. Pokud se někdo pokusí přes falešný odkaz dostat do aplikace, Nette
Metodická východiska práce
26
Framework pozná, že hodnota tokenu je neplatná a rozpozná tak útok a nepovolí uživateli vstup. I když session hijacking a session stealing nesouvisí s psaným kódem, ale se serverem, kde je aplikace umístěna, přesto Nette Framework tento problém řeší. Automaticky zkonfiguruje PHP tak, aby se útočník nemohl dostat k SID(session id) ať už přes cookies, URL či odposloucháváním. Ochrana proti invalid UTF-8 je implementována na nejnižší úrovni (třida HttpRequest) a v routeru. Každý vstupní řetězec je tedy převeden do validního UTF-8 a do databáze se tak nemůže dostat škodlivý kód. Zend Framework Ve verzi 1.6. byla náhodou objevena zranitelná místa pro XSS útok. Proto byl proveden bezpečnostní audit, který další slabiny odhalil. Od dalších verzí jsou tedy aplikace Zend Frameworku chráněny proti těmto útokům. Na základě této zkušenosti byla také vytvořena stránka, kde mohou uživatelé hlásit jimi nalezené bezpečnostní problémy a díry, které jsou vzápětí opraveny. Zend Framework také bojuje proti spamu. Obsahuje komponentu Zend_captcha, která přináší podporu pro rozpoznání uživatele. Rozpoznání může být provedeno pomocí obrázku, figlet textu nebo ReCaptchy. Figlet text je text vytvořený pomocí ASCII znaků. Image generuje obrázek, ve kterém je vepsaný text. ReCaptcha je bezplatný systém, který napomáhá rozpoznávat nascanované tištěné zdroje. Uživateli je předložen text označený za sporný programem OCR a uživatel svým opsáním tohoto textu pomáhá k jeho určení. Symfony Využití Yaml souborů chrání aplikace před XSS útoky. Další možnosti ochrany závisí již na uživateli. 3.1.3
Komunita
Nette Framework Komunita Nette Frameworku se momentálně spíše vytváří, ale především díky úsilí Davida Grudla se tento framework dostává do povědomí lidí a komunita se rychle rozši-
Metodická východiska práce
27
řuje. David vydává velké množství článků o tvorbě webových aplikací, dále je častým diskutérem na odborných i neodborných fórech, přednáší na školách a odborných konferencích a také pořádá každý týden setkání vývojářů, kde se prezentují novinky z Nette Frameworku či probírají aktuální témata. Díky tomu, že komunita kolem Nette Frameworku je vedena v poměrně přátelském prostředí, nastávají i situace, kdy uživatelé navrhují vylepšení Nette Frameworku a diskutují o jejich zakomponování přímo s vývojáři, kteří ji následně do frameworku přidají. Fórum tohoto frameworku je poměrně živé a konzultace případných problémů je rychlá a věcná. Komunita prozatím dostatečně zastupuje rozpracovanou dokumentaci. Zend Framework Zend Framework je celosvětově rozšířen a odpovídá tomu i jeho obrovská uživatelská základna. Ne jinak tomu je i u v České republice a najít fóra či stránky s návody a radami k tomuto frameworku není žádný problém. Jelikož samotné PHP využívá Zend Engine tak se dá říci, že v podstatě každý programátor webových aplikací se s tímto frameworkem, alespoň okrajově setkal. Symfony Symfony je stejně jako Zend Framework celosvětově velice rozšířeno. V České republice však za ostatními frameworky poněkud zaostává a komunitu zde má nejslabší. Najít českého programátora, který by dělal v tomto frameworku je asi nejobtížnější a proto se pro případné rady a konzultace je potřeba poohlédnout za hranice. 3.1.4
Technologie
V práci byly představeny některé moderní technologie u kterých vývojář očekává, že s nimi bude moci ve frameworku spolupracovat. Tabulka znázorňuje, jaké technologie který framework podporuje.
Metodická východiska práce
Obr. 8
Frameworky a podpora technologií
3.1.5
Vývoj
28
Nette Framework Ačkoli je vývoj úzce spjat s jediným tvůrcem, Nette Framework velice úspěšně začleňuje novinky do svého kódu. Například jmenné soubory byly v Nette Frameworku zavedeny dříve než v Zend Frameworku a autoři jen čekali na vydání nové verze PHP, aby je mohli začít využívat. Na tomto příkladu je vidět, že vývojáři sledují novinky na poli PHP a rychle na ně reagují, což je pro framework jen dobře. Zend Framework Pokud by měl mít tento framework nějaké eso v rukávu pak to bude jistě jeho vývoj. Jak již bylo řečeno, kolem Zend Frameworku existuje široká skupina vývojářů mezi nimiž jsou samotní tvůrci PHP, díky čemuž má Zend Framework obrovskou výhodu oproti ostatním frameworkům. Ačkoli přidávání novinek je díky důkladnému testování poněkud zdlouhavé, nakonec jsou vždy nové komponenty perfektně připraveny k použití a menší zdržení pak může ve výsledku ušetřit spoustu času s dolaďováním za chodu. Symfony Symfony jako jediné doposud nepodporuje PHP 5.3. Tato nevýhoda je dána především chystaným vydáním nového Symfony 2.0, které by mělo přinést spoustu novinek s podporou aktuálních verzí programů, které využívá. Nová verze by měla vyjít během roku 2010 a uživatelé do ní vkládají velká očekávání. Na rozdíl od ostatních frameworků Symfony nabízí podporu i předešlých verzí po dobu tří let takže vývojáři nemusí okamžitě přecházet na novou verzi. Přesto je však vývoj o něco pomalejší než u ostatních frameworků. 3.1.6
Dokumentace
Nette Framework Jelikož jde o český framework tak i dokumentace je psána v češtině. Čeština je výhodou i nevýhodou zároveň. Neangličtinář českou dokumentaci jistě uvítá, ale toto omezení
Metodická východiska práce
29
také brání širšímu rozšíření frameworku za hranice. Plusem je alespoň to, že se na dokumentaci, české i té anglické, úsilovně pracuje a s rozšiřující komunitou tohoto frameworku se i více lidí věnuje jejímu psaní. Momentálně je kompletní API dokumentace což je popis všech tříd, funkcí a parametrů. Začínající uživatel má dále k dispozici screencasty a několik tutoriálů. Zend Framework Zend Framework není žádný nováček a proto je jeho dokumentace velice obsáhlá. Dokumentace obsahuje API příručku, více jak 500 příkladů, referenční příručku, která je přeložena do šesti jazyků a částečně přeložena do dalších osmnácti. K dispozici je i multimediální dokumentace složená z rozhovorů, screencastů, prezentací a návodů. Oficiální stránky frameworku jsou v angličtině, ale velká komunita je i v našich končinách a tak není problém po krátkém hledání najít rady i na českých fórech a stránkách. Stejně tak i existuje mnoho návodů přímo v češtině. Dokumentace Zend Frameworku je z uvedených frameworků nejobsáhlejší. Symfony Dokumentace Symfony jde trochu jinou cestou než ostatní frameworky. Je rozdělena na API příručku a dál obsahuje tři rozsáhlé knihy, které postupně uživatele seznámí s frameworkem. Knihy jsou značně rozsáhlé a podrobné a napsali je samotní autoři frameworku. Na stránkách jsou dále k dispozici screencasty. Na oficiálních stránkách se pracuje i na překladech některých částí do mnoha jazyků, ale práce jdou dosti pomalu. Stejně jako u komunity i u dokumentace je potřeba hledat převážně v zahraničních zdrojích.
3.2
Vyhodnocení
U rychlosti je z grafů patrné, že rozdíly mezi frameworky nejsou natolik velké, aby z nich mohl být vyvozen jednoznačný závěr. I názory uživatelů o podobných testech vypovídají o tom, že jim nepřikládají výraznou výpovědní hodnotu o daném frameworku. Například tvůrci Symfony veřejně přiznávají, že jejich framework není určen pro jednoduché aplikace. Na rozdíl od nich Nette Framework má být naprosto univerzální a z časů je to patrné.
Metodická východiska práce
30
Vyhodnocení bezpečnosti je věnována samostatná kapitola až v závěru práce, konkrétně v části diskuze. Výsledná tabulka není žádným překvapením, podpora zmíněných technologií lze u každého frameworku předpokládat. Jediné Symfony má malé zpoždění s podporou nové verze PHP, ale to již bylo vysvětleno. V konkurenci Zend Frameworku na jehož vývoji se podílí několik set vývojářů je rychlost vývoje Nette Frameworku velkým překvapením. Samozřejmě Nette Framework nemůže konkurovat v množství komponent, které Zend Framework nabízí. Vývoj Symfony je trochu odlišný, jelikož obsahuje části jiných softwarů, jejichž vývoj tvůrci Symfony neovlivní. Každopádně zde Symfony oproti ostatním frameworkům trochu ztrácí. Nejslabším článkem Nette Frameworku je komunita a dokumentace. Právě díky nedokončené dokumentaci někteří uživatelé váhají z přechodem na tento framework. Rize české stránky také neumožňují větší rozšíření za hranice. Alespoň v API příručce jsou použity anglické popisy tříd, které tuto bariéru trochu snižují. Dokumentace se tak stává největší slabinou, kterou částečně sice komunita nahrazuje, ale zároveň komunitě brání v růstu. Celkově lze ale říci, že přes svůj mladý věk Nette Framework zaostává v místech, kde by se to méně čekalo a naopak například ve vývoji s ostatními frameworky drží krok.
Realizace redakčního systému
31
4 Realizace redakčního systému Obecné vlastnosti, které definují redakční systém již byly zmíněny v teoretické části. Nyní budou uvedeny konkrétní uživatelské požadavky na systém, které budou hned převedeny na požadavek z pohledu vývojáře výsledné aplikace. Prvním pohled na požadovanou aplikaci je z pohledu uživatele, který bude hotový systém používat a který nehledí na technickou stánku věci. Jedná se o člověka, který se jednou za čas do aplikace přihlásí a přidá či upraví nějaký text, přečte případné zprávy, na některé odepíše a jde dál brouzdat po internetu nebo věnovat své práci. Může se jednat například o sekretářku, která má na web umisťovat firemní aktuality. Takový uživatel uvítá uživatelsky přívětivé prostředí, které svižně reaguje na jeho požadavky a pobyt v administraci co nejvíce zkrátí. Aby takový systém byl, měl by co nejlépe simulovat desktopové rozhraní, aby se i méně technicky náročný uživatel rychle zorientoval. Navíc může systém přidat prvky, které budou intuitivně napomáhat plnit některé příkazy. Tyto požadavky může pomoci splnit AJAX, JavaScriptový framework jQuery a JavaScript. Tito tři pomocníci mohou splňovat požadavek na určitou interaktivitu aplikace. Požadavek na rychlost, pokud předpokládáme vývoj v některém frameworku, znamená, že by se neměly zbytečně includovat nadbytečné knihovny a když už, tak by toto načtení nemělo výrazně ovlivnit svižnost celé aplikace. Když už tato sekretářka nějaký článek vloží, lze předpokládat, že text pravděpodobně vykopírovala ze zdroje a o další formátování, či dokonce estetickou stránku se nestará. Estetickou nedokonalost mohou částečně pomoci opravit předchystané šablony pro články, zformátované pomocí CSS souborů. Vykopírovaný text může obsahovat nejrůznější nežádoucí elementy a proto by měl systém dbát na validní výstupy. Článek by měl být také po uložení vhodně použit, aby jej zaznamenali vyhledávače tudíž, aby využil SEO možností s čímž souvisí i zachování validity webu. V obecných vlastnostech redakčních systémů byla také zmínka o různých uživatelských rolích. Rozšířený příklad se sekretářkou může tedy vypadat následovně. Její nadřízený jistě uvítá možnost připravený článek od sekretářky zkontrolovat a sám zveřejnit. Pokud bude článek špatně nachystán tak sekretářka může dostat výpověď a je potřeba jí zrušit přístup. Pro tyto případy by měl systém nabídnout jednoduché řešení pro správu účtů a jejich oprávnění. Řešením tohoto problému je takzvané ACL neboli Access con-
Realizace redakčního systému
32
trol list, což je seznam jednotlivých uživatelů a k nim přiřazených oprávnění. ACL může být buďto statické nebo dynamické. Pro redakční systém je rozhodně vhodné použít dynamické ACL, kdy nejsou práva pevně nastavena, ale existuje správce práv, který jednotlivým uživatelům přiřazuje nebo práva odebírá jak je potřeba. Pokud sekretářka dostane výpověď, může pociťovat určitou hořkost vůči bývalému zaměstnavateli a bude se chtít pomstít. Může využít například právě redakčního systému a smazat či nevhodně upravit některé články. Pokud ji bude včas smazán přístup do administrace nezbývá, než zkusit využít některou bezpečnostní díru. Způsoby jakými jde systém napadnout je nespočet a některé byly již dříve zmíněny. Pokud by měl vývojář každou možnou hrozbu eliminovat, bylo by to velice pracné a proto jakákoliv pomoc v tomto směru již od frameworku je vřele vítána. Bezpečnost je současně jedna z nejdůležitější vlastností redakčního systému. Již jen rozdělení na veřejnou a administrační část napovídá, že správu stránek mají mít na starost jen pověření lidé a nikdo další. Za pomyslnou zeď administrační části by neměl nikdo neoprávněný ani nahlédnout. Když uživatel dlouho brouzdá po internetu, občas se stane, že narazí na něco co se mu velice zalíbí a chtěl by to také mít. Je potřeba proto předpokládat, že redakční systém je stále ve vývoji a kdykoliv se mohou objevit nové požadavky. Ačkoli se dá vyvíjet systém jen pro konkrétní užití, stejně je potřeba neustále sledovat vývoj a očekávat, že v budoucnu se systém bude rozšiřovat nebo alespoň aktualizovat. Vývojář se proto musí snažit předvídat nepředvídatelné a všechny komponenty navrhovat tak, aby se s nimi dalo v budoucnu pracovat samostatně bez nutnosti změny celého systému. Z výše uvedených požadavků tedy vyplívá, že systém má být rychlý. Dále má podporovat CSS, AJAX, JavaScript, jQuery čili být technologicky přívětivý. Měl by hlídat validní vstupy a výstupy a celkově být přizpůsoben pro vyhledávače, což jde souhrnně nazvat podpora SEO optimalizace. Měl by snadno podporovat ACL čili správu uživatelů a měl by být dostatečně zabezpečen, takže kritéria podpora ACL a zabezpečení. V neposlední řadě by měl podporovat modifikaci aplikace.
4.1
Struktura aplikace
Nette Framework nechává vývojáři poměrně volnou ruku v tom jaká bude struktura výsledné aplikace. Přesto však existují určitá doporučení, jak by taková struktura mohla vypadat. V případě redakčního systému je jasné, že je potřeba aplikaci rozdělit na dvě
Realizace redakčního systému
33
relativně samostatné části. Relativně samostatné proto, protože se pohybujeme na poli objektově orientovaného programování, kde se využívá dědičnosti a obě části budou mít stejného předka. Ačkoli tedy bude existovat veřejná a administrační část, tento předek bude oddělen od obou těchto částí. Základní struktura aplikace by tedy mohla vypadat takto
Obr. 9
Struktura aplikace
Jak je tedy vidět z obrázku, základem jsou tři složky. App/, dokument_root/ a libs/. Složka libs obsahuje jednotlivé knihovny. V tomto případě se jedná o již představené Nette Framework a databázový layer dibi. Složka Addons bude obsahovat další vylepšováky pro aplikaci v podobě přídavných knihoven, pluginů a podobně. Poslední podsložka je texy. Jedná se o další z počinů hlavního vývojáře Nette Frameworku Davida Grudla. Texy je program pro psaní validního textu na web bez odborných znalostí. Stejně jako dibi, je Texy v Nette Frameworku plně podporováno. Složka dokument_root/ obsahuje náležitosti zobrazovaných stránek. Jednotlivé podložky obsahují soubory pro JavaScript, AJAX, Jquery, kaskádové styly, obrázky. Jediná složka texyla je malou neznámou, která bude přiblížena později. To nejdůležitější co složka dokument_root/ obsahuje není na obrázku vidět. Jedná se o soubor index.php.
Realizace redakčního systému
Obr. 10
34
Obsah souboru index.php
Překvapivě soubor index.php neobsahuje množství požadavků na knihovny, ale místo toho jen definuje ostatní složky a volá soubor bootsrap.php. Více příkazů v index.php ani není potřeba. Zbývá už jen složka app/, která obsahuje aplikační logiku aplikace. Jak již bylo řečeno, v případě redakčního systému (i v dalších případech) je aplikace rozdělena do dvou modulů a to FrontModule, který bude obsluhovat veřejnou část a AdminModule, kde bude obsažena vnitřní, zabezpečená sekce. Každá část bude mít svoje presentery a šablony, datová část bude společná. Jak bylo dřív avízováno, společným předkem obou částí bude presenter umístěný přímo ve složce app/presenters. Ve složce app/ jsou také dva velice důležité soubory. Jedním je z indexu volaný bootstrap.php a druhým config.ini. Bototstrap se stará o celé a nastavení aplikace a nakonec také celou aplikaci spouští. Zajišťuje také routování čili předává obsluhu dle URL adresy požadovaným presenterům. V neposlední řadě načítá nastavení ze souboru config.ini, který obsahuje připojení k databázi. Velice užitečnou vlastností je, že v config.ini mohou být uvedeny informace pro produkční i vývojové prostředí a aplikace sama detekuje, kde se nachází a podle toho se připojí. Pokud tedy vývojář dokončí testování své aplikace na lokálním počítači, může bez obav celou aplikaci zkopírovat do ostrého provozu a dál se nemusí o nic starat. Třída Nette/Enviroment už zařídí, aby se aplikace správně chovala. Vývojář ani nemusí vypínat nástroje pro vývoj, například zmiňovanou laděnku, protože aplikace samotná je na produkčním prostředí nenechá vyvolat. Další velice užitečnou metodou je RobotLoader. Může se zdát, že bootstrap.php bude také plný includů a requirů dalších souborů. Tato volání jdou jednoduše nahradit zavoláním RobotLoaderu v config.ini. Této metodě se předají pouze adresáře, které má
Realizace redakčního systému
35
prohledat a o zbytek se není třeba starat. Pokud vývojář volá nějakou metodu, RobotLoader se postará o její načtení, pokud je samozřejmě ve složce metodě předané. Díky tomu si může každý vývojář řešit strukturu dle libosti a stará se pouze o správné zavolání RobotLoaderu do potřebných složek.
4.2
Datová struktura
Datová struktura aplikace bude samozřejmě společná pro obě části aplikace. Vést zvlášť tabulky pro vnitřní a veřejnou sekci by bylo zbytečné. Rozdíl bude pouze v obsahu výpisu. Na přizpůsobení tohoto výpisu postačí práce pouze s presenterem a příslušnou šablonou. Navíc sdílení modelové části aplikace ušetří i několik řádků kódu, protože některé selekty nad databází budou pro oba moduly velice podobné.
Obr. 11
Databázové schéma aplikace
Pro vstup do administrační sekce se musí uživatel přihlásit za pomocí loginu (email) a hesla. Tyto informace uchovává tabulka uzivatel. Každý uživatel bude mít přiřazené role dle toho, do jakých sekcí v administraci by měl mít přístup a jaké činnosti tam může vykonávat. Tyto sekce jsou uloženy v tabulce sekce a pro každou sekci existují oprávnění. Oprávnění udělují práva do jednotlivých sekcí. Takže například role redaktor bude mít v sekci články právo vkládat a editovat, které mu přiřadí spojovací tabulka opravneni. Jelikož je počítáno s tím, že poslední slovo k vydání článku bude mít
Realizace redakčního systému
36
uživatel s rolí šéfredaktor, je vhodné, aby se role mohly vzájemně dědit. V tom případě nebude nutné nastavovat všechna stejná práva pro redaktora i šéfredaktora, ale bude stačit nastavit, aby šéfredaktor dědil práva od redaktora. Tento příklad byl zvolen záměrně, aby se na něm dala demonstrovat jedna bezpečností díra. Pokud by se práva dědila obráceně, redaktor by okamžitě dědil veškeré privilegia od šéfredaktora a veškeré jeho nadstandardní možnosti by bylo nutné dodatečně odstranit. V případě, že by v důsledku přehlédnutí zůstaly redaktorovi práva, která nemá mít, byl by to problém. Je tedy vhodné, aby se role dědily obráceně od nejnižší po nejvyšší a jednotlivým rolím byly jejich výsady přidávány. Tabulka dále počítá s možností hodnocení článků uživateli či rozdělení článků na různé sekce pomocí clanek_typ. Tabulka menu zajišťuje samotné generování položek ve venkovní sekci stránek. Tabulka počítá i se stromovou strukturou položek a proto obsahuje položku předek, která určuji do které sekce patří. Řazení menu i článků lze mimo jiné také zařídit pomocí tabulky priorita. Tato datová struktura je výchozí a samozřejmě dále rozšiřitelná. Pro základní funkcionalitu redakčního systému je však dostačující.
4.3
Zabezpečení
Možnosti zabezpečení, které Nette Framework poskytuje byly pospány již dříve. Nyní se nejzranitelnějším místem aplikace stávají uživatelé, kteří pro své vlastní pohodlí používají hesla, která si lehce zapamatují. Tato lehkomyslnost může poskytnout prostor pro napadnutí aplikace. Chtít po uživateli, aby si sám vymýšlel bezpečná hesla je sice jednou z cest, ale oblibu uživatelů si tím systém nezíská. Jelikož cílem je vytvořit uživatelsky přívětivou aplikaci, je dobré tuto starost nechat na systému samotném. Pochopitelně hesla budou uložena v databázi a to v kódovaném formátu. Konkrétně bude heslo uloženo jako SHA1 hash hesla. Aby byl vyřešen i problém s jednoduchými uživatelskými hesly, při vytváření každého uživatele bude k heslu připojen řetězec definovaný v config.ini, který se bude jmenovat security.jot, který z každého triviálního hesla udělá heslo složitější. Objekt, který bude zajišťovat ověření dat zadaných do přihlašovacího formuláře se bude jmenovat Authenticator. Název Authenticator není náhodný. Nette Framework samozřejmě s možností ACL počítá a i zde nabízí svou pomocnou ruku. Konkrétně se
Realizace redakčního systému
jedná
o
objekt
37
Nette\Security\Permission
implementující
rozhraní
Nette\Security\IAuthorizator poskytující programátorovi lehkou a flexibilní ACL vrstvu pro řízení práv a přístupů. Tato vrstva velmi úzce souvisí s objektem Nette\Web\User a jejím základem je definování pravidel způsobem, který byl uveden u struktury dat. Při využití těchto možností pak například pro zjištění rodičovských rolí stačí zavolat metodu $acl->getRoleParents('administrator');, která vrátí pole rolí. Výsledná třída je přiložena v příloze. Zaregistrování pak stačí provést jen jednoduše v config.ini pomocí příkazu service.Nette-Security-IAuthorizator = Authenticator. Třída je sice vytvořena a zaregistrována, zbývá ještě její správné zavolání. Aby uživatel neměl možnost dostat se do zabezpečených míst, je potřeba, aby bylo ověření autorizace prováděno jako první. Ke správnému určení, kdy metodu zavolat je potřeba se podívat na životní cyklus presenteru.
Obr. 12
Životní cyklus presenteru, zdroj: Nette Foundation
Z obrázku je patrné, že jako první se vykonává metoda startup(), která je proto ideálním místem na ověření uživatele. Aby každý presenter v administrační sekci nemusel v metodě startup toto ověření provádět, je vhodné vytvořit presenter, který bude předkem všech ostatních administrátorských presenterů a ty od něj budou ověření dědit. Aby to bylo úplně přesné, je potřeba vytvořit presentery dva. Jeden bude bránit uživateli, aby se dostal do vnitřních sekcí kam nesmí, ale zároveň se minimálně musí dostat k presenteru, který samotné přihlášení obstarává, čili vypíše přihlašovací formulář. Pokud by
Realizace redakčního systému
38
tento presenter neexistoval, uživatel by neměl možnost se přihlásit a automaticky by každý jeho pokus o vstup znamenal zamítnutí přístupu.
4.4
Přívětivé prostředí
Nyní je již vyřešeno, aby se uživatel dostal do vnitřní sekce. Ta by mu měla poskytovat komfort, který mu pobyt zpříjemní a práce bude sama ubývat. Z databázového schématu je patrné, že uživatel může vkládat či upravovat články nebo spravovat menu vnější sekce. Vložení článku obsahuje několik náležitostí, které nelze od uživatele získat jinak než prostřednictvím formulářů. Neustálé přidávání a ošetřování formulářových výstupů je velice otravné a každý vývojář se často s touto rutinou potýká. Nette Framework práci s formuláři usnadňuje do nejvyšší míry. Konkrétně jde o třídu Nette\Application\AppForm.
Obr. 13
Jednoduchý kód pro výpis formuláře a výsledný formulář
Ukázka znázorňuje, že vytvoření formuláře, který je ošetřen, aby byly vyplněny všechny důležité vstupy, je velice snadné. Pro ochranu před CSRF útokem stačí doplnit ke kódu $form->addProtection([string $message = NULL], [int $timeout = NULL]); a formulář je chráněn. Pokud uživatel některé z polí nevyplní, pomocí JavaScriptu je na tuto skutečnost upozorněn. Nette Framework myslí i na to, když má uživatel JavaScript vypnutý a nabízí i alternativu v podobě textového výpisu. Pro zadávání textů je k poli text připojen editor Texyla. Jeho výhoda oproti jiným editorům bude popsána dále. V tuto chvíli stačí, že uživateli poskytuje paletu pro formá-
Realizace redakčního systému
39
tování textu. Uživatel tak bez znalosti značkovacího jazyka může elegantně zformátovat text. Na obrázku je také vidět kalendář pro zadávání data. Aby uživatel nemusel sám vypisovat datum, při najetí na příslušné formulářové pole se mu zobrazí tento AJAXový pomocník. Pro Texylu i kalendář stačí jednoduché připojení v presenteru viz. obrázek 13, a následné načtení potřebných JavaScriptových souborů v příslušné šabloně. Pomocí JQuery pak stačí nastavit vlastnosti dle libosti. Ukázka nastavení kalendáře alias datepicker v šabloně. <script type="text/javascript"> //
4.5
SEO
Prvním předpokladem pro optimalizovaný web jsou validní texty. Nette Framework sice automaticky provádí senzitivně kontextové escapovaní, což znamená, že převádí funkce na pouhou posloupnost znaků. Při výpisu pak stačí označit bloky, kde toto převedení chceme vypnout a text se zobrazí zformátovaný tak jak má být. Pokud ovšem uživatel zadává články či texty, nelze předpokládat odbornou znalost jazyků z webového prostředí a bez této znalosti nemůže text zformátovat do podoby, která by jej uspokojila. Častým řešením jsou takzvané WYSIWYG editory. Ty simulují známé uživatelské prostředí a označením textu a stisknutím tlačítka z nabídky text zformátují do žádané podo-
Realizace redakčního systému
40
by tak, že za uživatele vloží k textu potřebný kód. Výstupy těchto editorů však často bývají značně chaotické a především nevalidní. Řešením je již zmíněné Texy.
Obr. 14
Ukázka registrace filtru Texy v Presenteru a následné volání v šabloně
Kód z šablony konkrétně vypisuje jednotlivé články. Oproti kódu z WYSIWYG editoru je kód čistý a bez zbytečných tagů navíc. Tím je vyřešen výpis kódu. Ještě je potřeba jej nějak vhodně zadávat. K tomu poslouží přídavný editor Texyla. Dalším požadavkem byly dynamické tagy title, dle obsahu jednotlivých stránek. Pro tuto vlastnost využijeme dědičnosti šablon. Všechny šablony vychází z matky všech šablon, která se v Nette Frameworku jmenuje @layout.phtml. Zde v hlavičce stačí umístit kód např.
Bakalářská práce - {include #title}. Ve všech následovnících pak stačí umístit {block title} ve kterém bude umístěn text, který se má doplnit. Při rozkřiknutí každého článku se pak bude do tagu doplňovat nadpis prohlíženého článku. Výsledný kód v šabloně pak vypadá takto: {block title} {$article->nadpis} {/block}
4.6
Menu
Další základní vlastností redakčního systému je možnost spravovat menu stránek. Jelikož uživatel nemá možnost vidět strukturu menu veřejné části v administraci, má k dispozici alespoň naznačenou strukturu. Ta umožňuje procházení i stromového menu, to
Realizace redakčního systému
41
znamená menu, které obsahuje subpoložky. Pro tyto účely lze využít možnosti technologie AJAX, aby se subpoložky mohly zobrazovat bez nutnosti načítání celé stránky. Pro určení, že některý prvek využívá AJAX stačí v presenteru zavolat jednoduchou metodu $this->isAjax(). Každý prvek si pamatuje zda byl od posledního subrequestu pozměněn nebo ne, a zda tyto změny vyžadují překreslení. Nette Framework tuto kontrolu dokáže provádět i na nižší úrovni než na úrovni komponent. Užívá takzvané snippety. Do snipppetů lze uzavřít v šabloně jakákoliv část kódu. Ta je pak vystřižena a následně předána AJAXovému ovladači, který se již postará o její vykreslování. Následný kód znázorňuje kód, který vypíše název právě zobrazované položky menu. {snippet message} {if isset($site)} Položka "{$site->name}". {/if} {/snippet}
Diskuze a závěr
42
5 Diskuze a závěr 5.1
Diskuze
Během celé práce bylo několikrát zmíněno, že Nette Framework z hlediska bezpečnosti patří k jedněm z nejlépe hodnocených frameworků a není-li nejbezpečnější framework vůbec. Před jeho vydáním se podobná tvrzení vztahovala na Zend Framework a právě i proto, byl do srovnání zařazen. Postupné teoretické seznamování se s Nette Fameworkem dávalo tvrzením o jeho bezpečnosti za pravdu, avšak důležitá je především praktická zkušenost. Ostatní frameworky sice používají také některé prostředky podporující ochranu, ovšem v mnohem menším rozsahu než Nette Framework. V teoretické části práce byly představeny některé používané metody útoků na webové aplikace. Jediný Nette Framework nabídl řešení pro potlačení všech těchto útoků. Z tohoto pohledu se jeví jako nejbezpečnější. Pyšnit se titulem nejbezpečnější je sice velice lákavé, ale může to mít i svá úskalí. Mnoho vývojářů může na tuto vlastnost slyšet a podmínit tím své rozhodování ohledně výběru frameworku. Stejně tak toto prohlášení může být výzvou pro záškodníky, kteří se budou snažit dokázat, že je žádné zabezpečení nezastaví. Pokud dojde ke konfrontaci a záškodník uspěje právě u vývojáře, který chtěl mít bezpečnou aplikaci, titul nejbezpečnější framework se může otřást, i když bezpečností chyba nemusí být nutně zapříčiněna samotným frameworkem. Pokud se tedy vezme v potaz praktická stránka věci, Nette Framework pro zabezpečení aplikace z frameworků nabízí nejvíc služeb podporující zabezpečení a hypotéza, že se jedná o nejbezpečnější framework je pravdivá. Autoři by však ještě měli dodat, že framework samotný dokonale celou aplikaci neuchrání a uživatel sám musí tuto podanou ruku náležitě využít.
5.2
Závěr
Cílem práce bylo posoudit využitelnost Nette Frameworku v praxi. Porovnání se zavedenými frameworky ukazuje jaké vlastnosti framework má mít, aby ho uživatelé mohli využít v praxi bez větších komplikací a s patřičnou podporou. Srovnání ukázalo, že Nette Framework přes svou relativní mladost výrazně nezaostává za frameworky, které
Diskuze a závěr
43
mají za sebou léta vývoje a širokou vývojářskou základnu. Na základě srovnání lze tedy prohlásit, že se framework ukázal jako dobře využitelný v praxi. Přesto však má framework slabiny, které je potřeba doplnit. Konkrétně se jedná o nedodělanou dokumentaci a velice malý počet vývojářů podílejících se na vývoji. Oba nedostatky může napomoci vyřešit komunita v jejíchž řadách jsou členové, kteří ochotně poradí s případnými problémy i několik zkušených programátorů, kteří s Nette Frameworkem vykročili již v ranných stádiích a značně se podílí na fungování celého frameworku. Zapojení takových členů komunity do procesu vývoje by jistě bylo pro framework přínosem, ačkoli ze strany autora tento záměr prozatím není příliš podporován. Pokud se jedná o prostředí redakčních systémů, Nette Framework nabízí mnoho funkcí, tříd a metod, které tvorbu systému značně usnadní a v tomto ohledu si vede velice dobře. V rámci v práci vytvořené poptávky Nette Framework pokryl veškeré požadavky a proto se jeví jako vhodný pro využití při tvorbě redakčního systému. Pro každý požadavek nabídl efektivní a přívětivé řešení. Velice vítaná se jeví i spolupráce s dibi a Texy, které jsou plně podporované. V případě však, že by se systém začal mohutně rozšiřovat, Nette Framework by oproti jiným frameworkům měl nevýhodu slabší doplňkové základny. Omezené množství knihoven by mohlo vývojáře přimět vybrat pro tvorbu jiný framework. Ačkoli je Nette Framework teprve na začátku své cesty, zaslouženě na sebe poutá pozornost českých vývojářů. Praktické využití Nette frameworku značně usnadňuje práci a pokud se vývojářům podaří dořešit některá slabší místa, může tento český framework zdatně konkurovat jiným, celosvětově užívaným frameworkům. Po shrnutí všech výsledků lze prohlásit, že cíl práce byl naplněn.
Literatura
44
Literatura BROWN, Steven ; ALLEN, Rob; LO, Nick. Zend Framework in Action . [s.l.] : Manning Publications, 2008. 425 s. ISBN 1-933988-32-0.
DARIE, Christian; SIROVICH , Jaimie. Professional Search Engine Optimization With PHP. [s.l.] : Wrox, 2007. 360 s. ISBN 978-0470100929.
GARRETT, J. Ajax: A New Approach to Web Applications. [online], Datum publikování
18.
02.
2005,
[citováno
1.
05.
2010].
Dostupný
z
WWW:
http://adaptivepath.com/ideas/essays/archives/000385.php.
GILMORE, W. Jason . Velká kniha PHP a MySQL 5 : kompendium znalostí pro začátečníky i profesionály. [s.l.] : Zoner Press , 2007. 864 s. ISBN 80-86815-53-6.
GRAPPONE, Jennifer ; COUZIN, Gradiva . SEO - Search Engine Optimization. [s.l.] : Toner Press, 2007. 328 s. ISBN 978-80-86815-85-5.
GRUDL, David . La Trine [online]. 2007-11-09 [cit. 2010-05-07]. Téměř v cíli: dibi 0.9b. Dostupné z WWW:
.
GRUDL, David. Zdroják [online]. 2009-03-17 [cit. 2010-05-07]. Nette Framework: Odvšivujeme. Dostupné z WWW: .
HAVLÍN, Zdeněk. PHP Frameworky. Praha, 2009. 62 s. Bakalářská práce. Česká zemědělská univerzita v Praze.
HOLZNER, Steven . Mistrovství v Ajaxu. [s.l.] : Computer Press, 2007. 592 s. ISBN 978-80-251-1850-4.
Literatura
45
HUSEBY, Sverre H. . Innocent Code : A Security Wake-Up Call for Web Programmers. [s.l.] : Wiley, 2004. 246 s. ISBN 978-0-470-85744-1.
KONEČNÝ, Vladimír. Integrované informační systémy. [online]. Brno, MZLU. 2006. Dostupný z WWW: . MACHÁŇ, V. Strukturovaný redakční systém. Brno, 2003. 88 s. Diplomová práce. MZLU v Brně.
MCARTHUR, Kevin . Pro PHP : Patterns, Frameworks, Testing & More: Patterns, Frameworks, Testing and More. [s.l.] : Apress, 2008. 349 s. Dostupné z WWW: . ISBN 1-59059-819-9.
Nette Foundation, dibi [online]. 2009 [cit. 2010-05-07]. Dostupné z WWW: < http://dibiphp.com/cs/quick-start>.
Nette Foundation, Nette [online]. 2009 [cit. 2010-05-07]. Nette\Forms. Dostupné z WWW:
forgery-csrf>.
Nette Foundation, Nette documentation [online]. 2009 [cit. 2010-05-07]. Dostupné z WWW: .
POTEL, Mike. Wildcrest Associates : Software products and consulting [online]. 1996 [cit. 2010-05-07]. MVP: Model-View-Presenter The Taligent Programming Model for C++
and
Java.
Dostupné
z
WWW:
.
PHP GROUP, PHP. [online]. 2001. Dostupný z WWW: . php
FUSE
[online].
2009.
Dostupný
.
z
WWW:
Literatura
46
POTENCIER , Fabien; ZANINOTTO, Francois. The Definitive Guide to Symfony. [s.l.] : Apress , 2007. 486 s. ISBN 1-59059-786-9.
RYBÁK, Petr; KOTAČKA , Vít. Http://www.symfony-project.org/ [online]. 2007-0713, 2007-07-19 [cit. 2010-05-05]. Kapitola 1 - Úvod do symfony. Dostupné z WWW: .
SHIFLETT, Chris . Essential PHP Security . [s.l.] : O'Reilly Media, 2005. 128 s. ISBN 0-596-00656-X.
SWEAT, Jason E. . PHP | Architect's Guide to PHP Design Patterns. [s.l.] : Marco Tabini & Associates, Inc., 2005. 340 s. ISBN 0-9735898-2-5.
Zend Framework CZ – novinky [online]. 2010 [cit. 2010-05-07]. Zend Framework 1.9.7, 1.8.5,
a
1.7.9
vydán.
Dostupné
z
WWW:
.
ZEND, Technologies. Zend Framework Documentation. [online]. 2006 [cit. 2010-0507]. Dostupné z WWW: .
Přílohy
Přílohy
47
A Třída Authenticator
48
A Třída Authenticator
if (!$row) { throw new AuthenticationException("Uživatel s registračním emailem '$login' se nenašel!", self::IDENTITY_NOT_FOUND); }
$config = Environment::getConfig('security'); $password
=
sha1($credentials[self::PASSWORD]
.
$config-
>jot);
if ($row->password !== $password) { throw
new
AuthenticationException("Zadali
heslo!", self::INVALID_CREDENTIAL); }
return new Identity($row->name, $row->role); } }
jste
nesprávné