nav line

Výběr vhodného šablonovacího systému pro webintegrační projekt na platformě PHP

Co je šablonovací systém? Co získám a co ztratím, pokud nějaký šablonovací systém začnu používat ve svém webovém projektu? A jaký šablonovací systém používáte vy? Tento článek si klade za cíl poodhalit roušku tajemství a vnést trochu světla do problematiky šablon a systémů, které je spravují.

Programovací jazyk PHP byl vyvinut téměř před dvaceti lety jako aplikační platforma pro generování dynamických webových stránek.

Za poměrně dlouhou dobu jeho existence došlo k několika výrazným vylepšením vnitřní struktury jazyka, zejména s příchodem verze PHP 5.0 v roce 2004, kdy byl s novým jádrem Zend Engine II přepracován objektový model. Nový objektový model umožnil vzniknout velkému množství open source objektově orientovaných webových frameworků s MVC (model-view-controller) architekturou jako např. Zend Framework, Symfony, CodeIgniter, CakePHP nebo v Česku velmi populární Nette Framework. Zpočátku primitivní skriptovací jazyk si osvojil pojmy jako "controller" či "DI contrainer" a programování v PHP se rázem stalo o něco atraktivnější.

Použití čistého PHP v prezentační vrstvě dynamického webu s sebou ale přináší jistá rizika, kterých se lze vyvarovat použitím některého šablonovacího systému. V tomto článku bych chtěl vyzdvihnout význam používání šablonovacích systémů ve webových aplikacích a také představit některé aspekty, které moderní šablonovací systémy adoptují.

<?php echo $foo; ?>

V poslední době se v PHP neobjevily žádné nové jazykové konstrukty či syntaktické zkratky (syntactic sugar), které by reflektovaly aktuální požadavky a potřeby dnešních front-end vývojářů. Ať už na poli zjednodušení syntaxe často opakovaných a používaných částí kódu nebo na poli bezpečnosti, zejména “escapování” obsahu proměnných za účelem ochrany proti XSS (cross site scripting) útokům.

Proto vznikají šablonovací systémy buď samostatně ve formě znovupoužitelných knihoven (Smarty, Twig) nebo jako integrované součásti webových frameworků (Latte). Systémy, které jsou neoddělitelně spjaty se svým mateřským frameworkem se hůře udržují a ze své podstaty často nejsou použitelné samostatně. Jedním z aspektů použitelnosti šablonovacího systému ve webové aplikaci je jeho schopnost pracovat samostatně, tj. nezávisle na aplikačním frameworku. Současný trend je funkcionalitu spíše drolit a nechat na programátorovi, aby si svobodně zvolil, jakou knihovnu pro daný projekt použije.

Samozřejmostí by měla být kvalitní dokumentace v odpovídajícím rozsahu. Každý open source projekt, který není dostatečně zdokumentován, jakoby neexistoval.

Šablonovací jazyk

Nasazení a používání šablonovacího systému většinou znamená učit se de-facto nový programovací jazyk. Jazyk, který není určen pro implementaci aplikační logiky, nýbrž jazyk, který je vysoce optimalizován pro použití v šablonách. Platí, že syntaxe takového jazyka je jednoduchá a napříč šablonovacími systémy často podobná a velmi často také nastavitelná. Investice do studia a osvojení základů jazyka jednoho je pak částečně využitelné i pro jazyky ostatní.

Velký důraz je kladen na bezpečnost zacházení s obsahem proměnných. Většina šablonovacích systémů umožňuje unifikovaný přístup jak k prvku pole, tak k property objektu. Vývojář takové šablony pak nemusí přemýšlet o typu proměnné, ke které přistupuje.

XSS hrozba

Jeden z hlavních argumentů zavedení šablonovacího systému je asistence programátorovi při výpisu proměnných s předem neznámým a tedy potencionálně nebezpečným obsahem. Při nesprávném zacházení s obsahem proměnných může být webová aplikace lehce napadnutelná pomocí XSS. XSS spolu s SQL Injection jsou dvě nejprimitivnější formy útoku, jejichž princip, stejně tak jako i ochrana proti těmto útokům jsou mnohokrát popsány a zdokumentovány. I přesto v dnešní době tu a tam slýcháme, že došlo v lepším případě k masivnímu úniku přístupových údajů, v horším případě krádeži proprietárního softwaru či jiného duševního vlastnictví firem. To vše díky selhání často celého řetězce bezpečnostních bariér.

Aby byla webová aplikace odolná vůči XSS, je doporučeno praktikovat hned několik opatření (bezpečnostní HTTP hlavičky, content security policy), což je nad rámec tohoto článku. Jedním z opatření je zajištění správného "escapování" hodnot proměnných zobrazovaných v odpovědi na http požadavek. Problematika escapování je však velmi složitou záležitostí. V (X)HTML šabloně se vyskytuje celá řada kontextů a v každém z nich je potřeba escapovat odlišným způsobem. Samotné PHP v tomto ohledu pomocnou ruku příliš nepodává a v důsledku toho může být správné ošetření výstupu problematické i pro zkušené programátory, natož pak pro front-end vývojáře či site-buildery, kteří upravují šablony na denní bázi. Zajištění správného escapování je tedy dalším z požadavků na moderní šablonovací systém.

Šablonovací systémy se s fenoménem escapovaní popasovávají rozdílně. Mírně se liší v množství kontextů, které pokrývají a také tím, jestli escapují automaticky či je nutné tuto funkci explicitně zapnout.

Co to ale vlastně termín “automatické escapování” znamená? Jakkoliv samo spásně toto označení může znít, znamená pouze to, že (pokud není specifikováno jinak) s veškerým výstupem bude zacházeno, jakoby se vyskytoval v ‘html’ kontextu. Toto opatření může výrazně redukovat napadnutelnost pomocí XSS, ale neodstraní ji úplně. I se zapnutým automatickým escapováním musí vývojář každé šablony, ve které se vyskytuje výpis proměnné s potenciálně nebezpečným obsahem, brát zřetel na kontext, ve kterém se bude proměnná vypisovat!

Např. Twig rozeznává 5 různých kontextů ('html', 'js', 'css', 'url', 'html_attr'), přičemž ve výchozím nastavení automaticky escapuje veškerý výstup jako v kontextu 'html'. Pokud je proměnná vypisována v jiném kontextu než 'html', je potřeba to na daném místě v šabloně explicitně sdělit.

Smarty ve verzi 3.0 pokrývá všechny základní kontexty, ale ve výchozím nastavení neescapuje automaticky. Lze ho ale zapnout. Opět ale padá a programátorova bedra rozhodnutí o typu kontextu, ve kterém proměnnou vypisuje. Podobné vlastnosti najdeme u velké většiny šablonovacích systémů (Twig, Smarty, Dwoo).

Latte posunuje pojem “automatické escapování” o kus dál. Při vypisování proměnných není nutné systém instruovat o typu kontextu (ani pro to neexistuje podpora). Systém Latte sám kontext detekuje a na jeho základě zvolí správnou escapovací strategii. A to i v případě tzv. zanořených kontextů, např. javascriptový kód v html atributu. V takovém případě je třeba výstup ošetřit pomocí kombinace 'js' a 'html' strategie.

K tomu, aby se webová aplikace stala napadnutelnou pomocí XSS, stačí, aby se na jediném místě na escapování zapomnělo nebo se jen použila chybná escapovací funkce pro ošetření výstupu.

Oddělení zodpovědností (separation of concerns)

Díky použití šablonovacího systému je možné účinněji eliminovat výskyt business logiky v šablonách, tedy v místech, kam bussiness logika nepatří. Některé systémy (Twig, FastTemplate) tuto problematiku řeší radikálně - úplným zákazem vkládání jakéhokoliv PHP kódu do šablony. V takové šabloně si vývojář musí vystačit pouze s jazykovými konstrukty šablonovacího systému. Jakoukoliv komplexní funkcionalitu lze do šablony importovat pomocí modifikátorů (filterů) či dodatečných funkcí (helperů). Složitost implementace helperů a filterů a obecně rozšiřitelnost je jedním z klíčových parametrů šablonovacího systému, který rozhoduje o jeho použitelnosti ve webovém projektu.

Dalším aspektem, který pomáhá lépe separovat aplikační a prezentační vrstvu, a který je implementován napříč šablonovacími systémy, je koncept "limited scope". V praxi se tento koncept projevuje tak, že v kontextu (scope) šablony jsou "viditelné" pouze ty proměnné, které programátor explicitně deklaruje. Kontext šablony je tedy limitován a šablona jako taková je se zbytkem aplikace vázána jen velmi volně (prostřednictvím view modelu), což napomáhá jak znovu použitelnosti, tak přehlednosti.

Dědičnost

Dědičnost je jeden z dalších aspektů, které moderní šablonovací systémy nabízejí. Pro dědičnost šablon není v PHP přímá podpora. Její realizace je tedy plně v režii šablonovacího systému. Z šablon je díky tomu možné vytvářet libovolně složité hierarchie layoutů, které lze díky dědičnosti mnohonásobně využít jak v rámci jedné aplikace, tak napříč dalšími webovými projekty.

Základní stavební kámen šablony je blok (block). Blok je ohraničená část HTML, která může být v libovolném potomkovi přepsána či pouze doplněna. Koncept pojmenovaných bloků zavádějí všechny známé systémy (Twig, Smarty, Latte, Dwoo, FastTemplate).

Rychlost

Použití šablonovacího systému má v dnešní době minimální dopad na celkovouperformance webové aplikace. Při posuzování, který systém zvolit, má hledisko rychlosti spíše okrajový význam. Moderní šablonovací engine vždy zdrojovou šablonu zkompiluje do nativního PHP a pro renderování používá zkompilovanou verzi. Pokud dojde ke změně zdrojové šablony, automaticky se znovu překompiluje. Optimalizace kompilátorů je předmětem bouřlivého vývoje a proto nelze jednoznačně doporučit konkrétní systém. Na webu existuje množství benchmarků, které ale často postrádají objektivitu. Nehledě na to, že předmětem porovnávacích testů jsou většinou akademické konstrukce, které dávají jen malý vhled do rychlosti a efektivity, byť mohou být rozdíly v rozsahu několika řádů.

Obecně platí, že čím je systém jednodušší, tím je také rychlejší. Nejinak je tomu i v doméně šablonovacích systémů.

Závěrem

O šablonovacích systémech toho bylo napsáno mnoho. V současné době existuje nepřeberné množství systémů, ze kterých si lze vybrat. Výhody plynoucí z jejich používání jsou nesporné. Navzdory tomu, že na webu lze narazit na desítky systémů, v současné době jsou nejvíce citované Twig a Smarty.

Popularita Twigu se odvíjí od vzrůstající celosvětové popularity webového frameworku Symfony, jehož je Twig součástí. Smarty je zase tradiční systém s velkou uživatelskou základnou. V českých vodách má velké zastoupení Latte, jakožto integrální součást Nette frameworku. V dubnu tohoto roku ale došlo k vydání Nette 2.1.2, ve kterém je Latte (zatím v beta verzi) možné použít samostatně, což by mohlo napomoci v budoucnu jeho většímu rozšíření.

Ohodnoťte článek

Výběr vhodného šablonovacího systému pro webintegrační  projekt na platformě PHP

Související články

Vyhledávání na blogu

Webová integrace

Webová integrace jako nová oblast pro business „velkých" webových agentur.

o webové integraci

Profily blogujících