Dlaczego warto używać szablonów?
- Dlaczego mam używać systemu szablonów w PHP?
- Dlaczego Latte jest lepsze od Twiga czy Blade'a?
- Czym jest escapowanie?
- Czy z szablonu Latte można wykonać zapytanie do bazy danych?
- Jakie są główne różnice między systemami szablonów Latte, Twig i Blade?
- Czy firmom opłaca się używać systemu szablonów?
- Czy Latte wpływa na wydajność aplikacji webowych?
Dlaczego mam używać systemu szablonów w PHP?
Po co używać systemu szablonów w PHP, skoro samo PHP jest językiem szablonów?
Przypomnijmy sobie najpierw pokrótce historię tego języka, pełną ciekawych zwrotów akcji. Jednym z pierwszych języków programowania używanych do generowania stron HTML był C. Szybko jednak okazało się, że jego stosowanie do tego celu jest niepraktyczne. Rasmus Lerdorf stworzył więc PHP, które ułatwiło generowanie dynamicznego HTML z językiem C na backendzie. PHP zostało pierwotnie zaprojektowane jako język szablonów, ale z czasem zyskało kolejne możliwości i stało się pełnoprawnym językiem programowania.
Mimo to nadal działa jako język szablonów. W pliku PHP może znajdować się strona HTML, w której zmienne wypisuje się za
pomocą <?= $foo ?> itd.
Już na początku historii PHP powstał system szablonów Smarty, którego celem było ścisłe oddzielenie warstwy prezentacji (HTML/CSS) od logiki aplikacji. Celowo udostępniał język bardziej ograniczony niż samo PHP, aby programista nie mógł na przykład wykonać z szablonu zapytania do bazy danych. Z drugiej strony stanowił w projektach dodatkową zależność, zwiększał ich złożoność, a programiści musieli uczyć się nowego języka Smarty. Korzyści były dyskusyjne i do szablonów nadal używano zwykłego PHP.
Z czasem systemy szablonów zaczęły stawać się użyteczne. Przyniosły koncepcje takie jak dziedziczenie, tryb sandbox i szereg innych funkcji, które znacząco uprościły tworzenie szablonów w porównaniu z czystym PHP. Na pierwszy plan wysunął się temat bezpieczeństwa, istnienie podatności takich jak XSS i konieczność escapowania. Systemy szablonów wprowadziły automatyczne escapowanie, aby wyeliminować ryzyko, że programista o nim zapomni i stworzy poważną lukę bezpieczeństwa (za chwilę zobaczymy, że ma to pewne pułapki).
Dziś korzyści z systemów szablonów znacznie przewyższają koszty związane z ich wdrożeniem. Dlatego warto ich używać.
Dlaczego Latte jest lepsze od Twiga czy Blade'a?
Powodów jest kilka – jedne są przyjemne, inne fundamentalnie użyteczne. Latte łączy jedno z drugim.
Najpierw ten przyjemny: Latte ma taką samą składnię jak PHP. Jedyna różnica to zapis tagów, w którym
preferowane są krótsze { i } zamiast <?= i ?>. Oznacza to, że nie
musisz uczyć się nowego języka. Koszty szkolenia są minimalne. Co najważniejsze, podczas tworzenia nie musisz nieustannie
“przełączać się” między językiem PHP a językiem szablonów, bo to jeden i ten sam język. Inaczej niż w szablonach
Twiga, które używają składni podobnej do Pythona i zmuszają programistę do przeskakiwania między dwoma różnymi
językami.
A teraz powód niesamowicie użyteczny: Wszystkie systemy szablonów, takie jak Twig, Blade czy Smarty, dorobiły
się ochrony przed XSS w postaci automatycznego escapowania. Dokładniej mówiąc,
automatycznego wywołania funkcji htmlspecialchars(). Twórcy Latte doszli jednak do wniosku, że to wcale nie jest
właściwe rozwiązanie. Różne części dokumentu wymagają bowiem różnych sposobów escapowania. Naiwne automatyczne
escapowanie jest funkcją niebezpieczną, ponieważ tworzy fałszywe poczucie bezpieczeństwa.
Aby automatyczne escapowanie było funkcjonalne i niezawodne, musi rozpoznawać, w którym miejscu dokumentu dane są wypisywane (nazywamy to kontekstami) i odpowiednio do tego dobierać funkcję escapującą. Musi więc być kontekstowo zależne. I właśnie to potrafi Latte. Rozumie HTML. Nie postrzega szablonu jedynie jako ciągu znaków, lecz wie, czym są tagi, atrybuty itd. Dlatego inaczej escapuje w tekście HTML, inaczej wewnątrz tagów HTML, inaczej w JavaScripcie itd.
Latte jest pierwszym i jedynym systemem szablonów dla PHP z escapowaniem zależnym od kontekstu. Stanowi jedyny naprawdę bezpieczny system szablonów.
I jeszcze jeden przyjemny powód: Ponieważ Latte rozumie HTML, oferuje inne bardzo przyjemne możliwości. Na przykład n:atrybuty. Albo kontrolę odnośników. I wiele więcej.
Czym jest escapowanie?
Escapowanie to proces zastępowania znaków o specjalnym znaczeniu odpowiadającymi im sekwencjami przy wstawianiu jednego
łańcucha do drugiego, aby zapobiec niepożądanym efektom lub błędom. Na przykład przy wstawianiu łańcucha do tekstu HTML,
gdzie znak < ma specjalne znaczenie (oznacza początek tagu), zastępujemy go odpowiadającą mu sekwencją, czyli
encją HTML <. Dzięki temu przeglądarka poprawnie wyświetli symbol <.
Prostym przykładem escapowania bezpośrednio przy pisaniu kodu PHP jest wstawienie cudzysłowu do łańcucha przez poprzedzenie go odwrotnym ukośnikiem.
Escapowaniu przyglądamy się dokładniej w rozdziale Jak bronić się przed XSS.
Czy z szablonu Latte można wykonać zapytanie do bazy danych?
W szablonach można pracować z obiektami, które przekaże do nich programista. Jeśli programista zechce, może przekazać do szablonu obiekt bazy danych i wykonać na nim zapytanie. Jeśli taki jest jego zamiar, nie ma powodu, by mu tego zabraniać.
Inaczej sytuacja wygląda, gdy chcesz dać klientom lub zewnętrznym koderom możliwość edytowania szablonów. Wtedy zdecydowanie nie chcesz, by mieli dostęp do bazy danych. Oczywiście nie przekażesz do szablonu obiektu bazy danych, ale co, jeśli da się do niej dostać przez inny obiekt? Rozwiązaniem jest tryb sandbox, który pozwala określić, które metody można wywoływać w szablonach. Dzięki temu nie musisz obawiać się naruszenia bezpieczeństwa.
Jakie są główne różnice między systemami szablonów Latte, Twig i Blade?
Różnice między systemami szablonów takimi jak Latte, Twig i Blade tkwią przede wszystkim w składni, bezpieczeństwie i integracji z frameworkami:
- Latte: Używa składni PHP, dzięki czemu jest łatwe do nauki i użycia. Zapewnia najwyższej klasy ochronę przed atakami XSS dzięki escapowaniu zależnemu od kontekstu. Dobrze zintegrowane z Nette Framework, ale można go używać samodzielnie.
- Twig: Używa składni podobnej do Pythona, która znacznie różni się od PHP. Escapuje bez rozróżniania kontekstu
(zwykły
htmlspecialchars). Dobrze zintegrowany z frameworkiem Symfony. - Blade: Używa mieszanki PHP i własnej składni. Escapuje bez rozróżniania kontekstu (zwykły
htmlspecialchars). Ściśle zintegrowany z możliwościami i ekosystemem Laravela.
Czy firmom opłaca się używać systemu szablonów?
Przede wszystkim koszty szkolenia, użytkowania i ogólne korzyści różnią się znacząco w zależności od systemu. System szablonów Latte, dzięki temu, że korzysta ze składni PHP, bardzo upraszcza naukę programistom znającym już ten język. Zwykle wystarczy kilka godzin, by programista poznał Latte na tyle dobrze, że koszty szkolenia spadają, a wdrożenie technologii i – co najważniejsze – efektywność w codziennej pracy przyspieszają.
Ponadto Latte zapewnia wysoki poziom ochrony przed podatnościami XSS dzięki unikalnej technologii escapowania zależnego od kontekstu. Ochrona ta ma kluczowe znaczenie dla bezpieczeństwa aplikacji webowych i minimalizuje ryzyko ataków, które mogłyby zagrozić użytkownikom lub danym firmy. Bezpieczeństwo aplikacji webowych jest też ważne dla reputacji firmy. Problemy z bezpieczeństwem mogą prowadzić do utraty zaufania klientów i nadszarpnąć wizerunek firmy na rynku.
Używanie Latte obniża również ogólne koszty tworzenia i utrzymania aplikacji, bo jedno i drugie staje się łatwiejsze. Używanie systemu szablonów zdecydowanie się więc opłaca.
Czy Latte wpływa na wydajność aplikacji webowych?
Choć szablony Latte są przetwarzane szybko, na produkcji ten aspekt tak naprawdę nie ma znaczenia. Powodem jest to, że pliki szablonów są parsowane tylko raz, przy pierwszym wyświetleniu. Następnie są kompilowane do natywnego kodu PHP, zapisywane na dysku i przy każdym kolejnym żądaniu wykonywane bez potrzeby ponownej kompilacji.
Tak to działa w środowisku produkcyjnym. Podczas tworzenia szablony Latte są rekompilowane za każdym razem, gdy zmieni się ich treść, więc programista zawsze widzi aktualną wersję.