Nette Documentation Preview

syntax
Dlaczego warto używać szablonów?
********************************


Dlaczego warto używać systemu szablonów w PHP? .[#toc-why-should-i-use-a-templating-system-in-php]
--------------------------------------------------------------------------------------------------

Po co używać systemu szablonów w PHP, skoro sam PHP jest językiem szablonów?

Najpierw krótko podsumujmy historię tego języka, która jest pełna ciekawych zwrotów akcji. Jednym z pierwszych języków programowania wykorzystywanych do generowania stron HTML był język C. Szybko jednak okazało się, że używanie go do tego celu jest niepraktyczne. Rasmus Lerdorf stworzył więc PHP, który ułatwiał generowanie dynamicznego HTML z językiem C na zapleczu. PHP został pierwotnie zaprojektowany jako język szablonów, ale z czasem zyskał dodatkowe funkcje i stał się pełnoprawnym językiem programowania.

Mimo to, nadal funkcjonuje jako język szablonów. Plik PHP może zawierać stronę HTML, w której zmienne są wyprowadzane za pomocą `<?= $foo ?>`, itd.

Na początku historii PHP powstał system szablonów Smarty, którego celem było ścisłe oddzielenie wyglądu (HTML/CSS) od logiki aplikacji. Celowo zapewniał on bardziej ograniczony język niż sam PHP, tak że np. programista nie mógł wykonać zapytania do bazy danych z szablonu itp. Z drugiej strony, stanowił dodatkową zależność w projektach, zwiększał ich złożoność i wymagał od programistów nauki nowego języka Smarty. Takie korzyści były kontrowersyjne, a do szablonów nadal używano zwykłego PHP.

Z czasem systemy szablonów zaczęły być użyteczne. Wprowadziły one takie pojęcia jak [dziedziczenie |template-inheritance], [tryb piaskownicy |sandbox] i szereg innych cech, które znacznie uprościły tworzenie szablonów w porównaniu z czystym PHP. Na pierwszy plan wysunął się temat bezpieczeństwa, istnienia luk w zabezpieczeniach [takich jak XSS |safety-first], oraz konieczność [ucieczki |#What is escaping]. Systemy szablonów wprowadziły auto-escaping, aby wyeliminować ryzyko, że programista zapomni o tym i stworzy poważną dziurę w bezpieczeństwie (wkrótce zobaczymy, że ma to pewne pułapki).

Obecnie korzyści płynące z zastosowania systemów szablonowych znacznie przewyższają koszty związane z ich wdrożeniem. Dlatego korzystanie z nich ma sens.


Dlaczego Latte jest lepsze niż Twig czy Blade? .[#toc-why-is-latte-better-than-twig-or-blade]
---------------------------------------------------------------------------------------------

Powodów jest kilka - niektóre są przyjemne, a inne ogromnie przydatne. Latte jest połączeniem przyjemnego z pożytecznym.

*Po pierwsze, przyjemne:* Latte ma taką samą [składnię jak PHP |syntax#Latte Understands PHP]. Jedyną różnicą jest notacja znaczników, preferująca krótsze `{` i `}` zamiast `<?=` i `?>`. Oznacza to, że nie musisz uczyć się nowego języka. Koszty szkolenia są minimalne. Co najważniejsze, podczas rozwoju nie musisz ciągle "przełączać się" między językiem PHP a językiem szablonów, ponieważ oba są takie same. Jest to w przeciwieństwie do szablonów Twig, które używają języka Python, zmuszając programistę do przełączania się między dwoma różnymi językami.

*Wszystkie systemy szablonów, takie jak Twig, Blade czy Smarty, ewoluowały tak, by zawierać ochronę przed XSS w postaci automatycznej [ucieczki |#What is escaping]. A dokładniej, automatycznego wywołania funkcji `htmlspecialchars()`. Twórcy Latte zdali sobie jednak sprawę, że nie jest to wcale właściwe rozwiązanie. Wynika to z faktu, że różne części dokumentu wymagają różnych metod escapingu. Naiwny auto-escaping jest niebezpieczną funkcją, ponieważ tworzy fałszywe poczucie bezpieczeństwa.

Aby auto-escaping był funkcjonalny i niezawodny, musi rozpoznać, w którym miejscu dokumentu dane są wyprowadzane (nazywamy to kontekstami) i odpowiednio dobrać funkcję ucieczki. Dlatego musi być [wrażliwy na kontekst |safety-first#Context-Aware Escaping]. I to właśnie potrafi Latte. Rozumie on HTML. Nie postrzega szablonu jako zwykłego ciągu znaków, ale rozumie, czym są znaczniki, atrybuty itp. Dlatego ucieka inaczej w tekście HTML, wewnątrz znaczników HTML, wewnątrz JavaScript itp.

Latte jest pierwszym i jedynym systemem szablonów PHP z ucieczką kontekstową. Jest to jedyny naprawdę bezpieczny system szablonów.

*I jeszcze jeden przyjemny powód:* Ponieważ Latte rozumie HTML, oferuje inne bardzo przyjemne funkcje. Na przykład [n:attributes |syntax#n:attributes]. Albo możliwość [sprawdzania linków |safety-first#Link checking]. I wiele innych.


Co to jest escaping? .[#toc-what-is-escaping]
---------------------------------------------

Ucieczka to proces polegający na zastępowaniu znaków o specjalnym znaczeniu odpowiednimi sekwencjami podczas wstawiania jednego ciągu znaków do drugiego w celu uniknięcia niepożądanych efektów lub błędów. Na przykład wstawiając do tekstu HTML ciąg znaków, w którym znak `<` ma specjalne znaczenie, ponieważ oznacza początek znacznika, zastępujemy go odpowiednią sekwencją, którą jest encja HTML `&lt;`. Dzięki temu przeglądarka poprawnie wyświetla symbol `<`.

Prostym przykładem ucieczki bezpośrednio podczas pisania kodu PHP jest wstawienie do ciągu znaków cudzysłowu poprzez umieszczenie przed nim odwrotnego ukośnika.

Ucieczkę omawiamy bardziej szczegółowo w rozdziale [Jak bronić się przed XSS |safety-first#How to Defend Against XSS?].


Czy z szablonu Latte można wykonać zapytanie do bazy danych? .[#toc-can-a-database-query-be-executed-from-a-latte-template]
---------------------------------------------------------------------------------------------------------------------------

W szablonach można pracować z obiektami, które przekazuje do nich programista. Jeśli programista chce, może przekazać do szablonu obiekt bazy danych i wykonać zapytanie. Jeśli zamierzają to zrobić, nie ma powodu, by im to uniemożliwić.

Inna sytuacja pojawia się, jeśli chcesz dać klientom lub zewnętrznym koderom możliwość edycji szablonów. W tym przypadku zdecydowanie nie chcesz, aby mieli dostęp do bazy danych. Oczywiście nie przekażesz obiektu bazy danych do szablonu, ale co jeśli dostęp do niej będzie możliwy poprzez inny obiekt? Rozwiązaniem jest [tryb piaskownicy |sandbox], który pozwala zdefiniować, jakie metody mogą być wywoływane w szablonach. Dzięki temu nie musisz się martwić o naruszenie bezpieczeństwa.


Jakie są główne różnice pomiędzy systemami templatkowania takimi jak Latte, Twig i Blade? .[#toc-what-are-the-main-differences-between-templating-systems-like-latte-twig-and-blade]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Różnice pomiędzy systemami templatkowania takimi jak Latte, Twig i Blade polegają głównie na ich składni, bezpieczeństwie i integracji z frameworkami:

- Latte: wykorzystuje składnię języka PHP, dzięki czemu jest łatwiejszy do nauczenia i użycia. Zapewnia najwyższej klasy ochronę przed atakami XSS.
- Twig: używa składni podobnej do Pythona, która jest zupełnie inna niż PHP. Ucieka bez rozróżniania kontekstu. Jest dobrze zintegrowany z frameworkiem Symfony.
- Blade: używa mieszanki PHP i własnej składni. Ucieka bez rozróżniania kontekstu. Jest ściśle zintegrowany z funkcjami i ekosystemem Laravel.


Czy warto, aby firmy korzystały z systemu szablonowania? .[#toc-is-it-worth-it-for-companies-to-use-a-templating-system]
------------------------------------------------------------------------------------------------------------------------

Po pierwsze, koszty związane ze szkoleniem, użytkowaniem i ogólnymi korzyściami różnią się znacznie w zależności od systemu. System szablonów Latte, dzięki wykorzystaniu składni PHP, znacznie ułatwia naukę programistom znającym już ten język. Zazwyczaj wystarczy kilka godzin, aby programista w wystarczającym stopniu zapoznał się z Latte, co zmniejsza koszty szkolenia i przyspiesza przyswajanie technologii, a co najważniejsze - efektywność w codziennym użytkowaniu.

Dodatkowo Latte zapewnia wysoki poziom ochrony przed podatnością XSS dzięki unikalnej technologii context-aware escaping. Ochrona ta jest kluczowa dla zapewnienia bezpieczeństwa aplikacji internetowych i zminimalizowania ryzyka ataków, które mogłyby zagrozić użytkownikom lub danym firmowym. Bezpieczeństwo aplikacji internetowych jest również ważne dla utrzymania dobrej reputacji firmy. Problemy z bezpieczeństwem mogą prowadzić do utraty zaufania klientów i zniszczenia reputacji firmy na rynku.

Korzystanie z Latte zmniejsza również ogólne koszty rozwoju i utrzymania aplikacji poprzez ułatwienie obu tych czynności. Dlatego korzystanie z systemu szablonowania jest zdecydowanie warte zachodu.


Czy Latte wpływa na wydajność aplikacji internetowych? .[#toc-does-latte-affect-the-performance-of-web-applications]
--------------------------------------------------------------------------------------------------------------------

Chociaż szablony Latte są przetwarzane szybko, ten aspekt nie ma większego znaczenia. Powodem jest to, że parsowanie plików występuje tylko raz podczas pierwszego wyświetlenia. Następnie są one kompilowane do kodu PHP, przechowywane na dysku i uruchamiane przy każdym kolejnym żądaniu bez konieczności ponownej kompilacji.

Tak właśnie działa to w środowisku produkcyjnym. Podczas rozwoju szablony Latte są rekompilowane za każdym razem, gdy zmienia się ich zawartość, więc programista zawsze widzi aktualną wersję.

Dlaczego warto używać szablonów?

Dlaczego warto używać systemu szablonów w PHP?

Po co używać systemu szablonów w PHP, skoro sam PHP jest językiem szablonów?

Najpierw krótko podsumujmy historię tego języka, która jest pełna ciekawych zwrotów akcji. Jednym z pierwszych języków programowania wykorzystywanych do generowania stron HTML był język C. Szybko jednak okazało się, że używanie go do tego celu jest niepraktyczne. Rasmus Lerdorf stworzył więc PHP, który ułatwiał generowanie dynamicznego HTML z językiem C na zapleczu. PHP został pierwotnie zaprojektowany jako język szablonów, ale z czasem zyskał dodatkowe funkcje i stał się pełnoprawnym językiem programowania.

Mimo to, nadal funkcjonuje jako język szablonów. Plik PHP może zawierać stronę HTML, w której zmienne są wyprowadzane za pomocą <?= $foo ?>, itd.

Na początku historii PHP powstał system szablonów Smarty, którego celem było ścisłe oddzielenie wyglądu (HTML/CSS) od logiki aplikacji. Celowo zapewniał on bardziej ograniczony język niż sam PHP, tak że np. programista nie mógł wykonać zapytania do bazy danych z szablonu itp. Z drugiej strony, stanowił dodatkową zależność w projektach, zwiększał ich złożoność i wymagał od programistów nauki nowego języka Smarty. Takie korzyści były kontrowersyjne, a do szablonów nadal używano zwykłego PHP.

Z czasem systemy szablonów zaczęły być użyteczne. Wprowadziły one takie pojęcia jak dziedziczenie, tryb piaskownicy i szereg innych cech, które znacznie uprościły tworzenie szablonów w porównaniu z czystym PHP. Na pierwszy plan wysunął się temat bezpieczeństwa, istnienia luk w zabezpieczeniach takich jak XSS, oraz konieczność ucieczki. Systemy szablonów wprowadziły auto-escaping, aby wyeliminować ryzyko, że programista zapomni o tym i stworzy poważną dziurę w bezpieczeństwie (wkrótce zobaczymy, że ma to pewne pułapki).

Obecnie korzyści płynące z zastosowania systemów szablonowych znacznie przewyższają koszty związane z ich wdrożeniem. Dlatego korzystanie z nich ma sens.

Dlaczego Latte jest lepsze niż Twig czy Blade?

Powodów jest kilka – niektóre są przyjemne, a inne ogromnie przydatne. Latte jest połączeniem przyjemnego z pożytecznym.

Po pierwsze, przyjemne: Latte ma taką samą składnię jak PHP. Jedyną różnicą jest notacja znaczników, preferująca krótsze { i } zamiast <?= i ?>. Oznacza to, że nie musisz uczyć się nowego języka. Koszty szkolenia są minimalne. Co najważniejsze, podczas rozwoju nie musisz ciągle „przełączać się“ między językiem PHP a językiem szablonów, ponieważ oba są takie same. Jest to w przeciwieństwie do szablonów Twig, które używają języka Python, zmuszając programistę do przełączania się między dwoma różnymi językami.

*Wszystkie systemy szablonów, takie jak Twig, Blade czy Smarty, ewoluowały tak, by zawierać ochronę przed XSS w postaci automatycznej ucieczki. A dokładniej, automatycznego wywołania funkcji htmlspecialchars(). Twórcy Latte zdali sobie jednak sprawę, że nie jest to wcale właściwe rozwiązanie. Wynika to z faktu, że różne części dokumentu wymagają różnych metod escapingu. Naiwny auto-escaping jest niebezpieczną funkcją, ponieważ tworzy fałszywe poczucie bezpieczeństwa.

Aby auto-escaping był funkcjonalny i niezawodny, musi rozpoznać, w którym miejscu dokumentu dane są wyprowadzane (nazywamy to kontekstami) i odpowiednio dobrać funkcję ucieczki. Dlatego musi być wrażliwy na kontekst. I to właśnie potrafi Latte. Rozumie on HTML. Nie postrzega szablonu jako zwykłego ciągu znaków, ale rozumie, czym są znaczniki, atrybuty itp. Dlatego ucieka inaczej w tekście HTML, wewnątrz znaczników HTML, wewnątrz JavaScript itp.

Latte jest pierwszym i jedynym systemem szablonów PHP z ucieczką kontekstową. Jest to jedyny naprawdę bezpieczny system szablonów.

I jeszcze jeden przyjemny powód: Ponieważ Latte rozumie HTML, oferuje inne bardzo przyjemne funkcje. Na przykład n:attributes. Albo możliwość sprawdzania linków. I wiele innych.

Co to jest escaping?

Ucieczka to proces polegający na zastępowaniu znaków o specjalnym znaczeniu odpowiednimi sekwencjami podczas wstawiania jednego ciągu znaków do drugiego w celu uniknięcia niepożądanych efektów lub błędów. Na przykład wstawiając do tekstu HTML ciąg znaków, w którym znak < ma specjalne znaczenie, ponieważ oznacza początek znacznika, zastępujemy go odpowiednią sekwencją, którą jest encja HTML &lt;. Dzięki temu przeglądarka poprawnie wyświetla symbol <.

Prostym przykładem ucieczki bezpośrednio podczas pisania kodu PHP jest wstawienie do ciągu znaków cudzysłowu poprzez umieszczenie przed nim odwrotnego ukośnika.

Ucieczkę omawiamy bardziej szczegółowo 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 przekazuje do nich programista. Jeśli programista chce, może przekazać do szablonu obiekt bazy danych i wykonać zapytanie. Jeśli zamierzają to zrobić, nie ma powodu, by im to uniemożliwić.

Inna sytuacja pojawia się, jeśli chcesz dać klientom lub zewnętrznym koderom możliwość edycji szablonów. W tym przypadku zdecydowanie nie chcesz, aby mieli dostęp do bazy danych. Oczywiście nie przekażesz obiektu bazy danych do szablonu, ale co jeśli dostęp do niej będzie możliwy poprzez inny obiekt? Rozwiązaniem jest tryb piaskownicy, który pozwala zdefiniować, jakie metody mogą być wywoływane w szablonach. Dzięki temu nie musisz się martwić o naruszenie bezpieczeństwa.

Jakie są główne różnice pomiędzy systemami templatkowania takimi jak Latte, Twig i Blade?

Różnice pomiędzy systemami templatkowania takimi jak Latte, Twig i Blade polegają głównie na ich składni, bezpieczeństwie i integracji z frameworkami:

  • Latte: wykorzystuje składnię języka PHP, dzięki czemu jest łatwiejszy do nauczenia i użycia. Zapewnia najwyższej klasy ochronę przed atakami XSS.
  • Twig: używa składni podobnej do Pythona, która jest zupełnie inna niż PHP. Ucieka bez rozróżniania kontekstu. Jest dobrze zintegrowany z frameworkiem Symfony.
  • Blade: używa mieszanki PHP i własnej składni. Ucieka bez rozróżniania kontekstu. Jest ściśle zintegrowany z funkcjami i ekosystemem Laravel.

Czy warto, aby firmy korzystały z systemu szablonowania?

Po pierwsze, koszty związane ze szkoleniem, użytkowaniem i ogólnymi korzyściami różnią się znacznie w zależności od systemu. System szablonów Latte, dzięki wykorzystaniu składni PHP, znacznie ułatwia naukę programistom znającym już ten język. Zazwyczaj wystarczy kilka godzin, aby programista w wystarczającym stopniu zapoznał się z Latte, co zmniejsza koszty szkolenia i przyspiesza przyswajanie technologii, a co najważniejsze – efektywność w codziennym użytkowaniu.

Dodatkowo Latte zapewnia wysoki poziom ochrony przed podatnością XSS dzięki unikalnej technologii context-aware escaping. Ochrona ta jest kluczowa dla zapewnienia bezpieczeństwa aplikacji internetowych i zminimalizowania ryzyka ataków, które mogłyby zagrozić użytkownikom lub danym firmowym. Bezpieczeństwo aplikacji internetowych jest również ważne dla utrzymania dobrej reputacji firmy. Problemy z bezpieczeństwem mogą prowadzić do utraty zaufania klientów i zniszczenia reputacji firmy na rynku.

Korzystanie z Latte zmniejsza również ogólne koszty rozwoju i utrzymania aplikacji poprzez ułatwienie obu tych czynności. Dlatego korzystanie z systemu szablonowania jest zdecydowanie warte zachodu.

Czy Latte wpływa na wydajność aplikacji internetowych?

Chociaż szablony Latte są przetwarzane szybko, ten aspekt nie ma większego znaczenia. Powodem jest to, że parsowanie plików występuje tylko raz podczas pierwszego wyświetlenia. Następnie są one kompilowane do kodu PHP, przechowywane na dysku i uruchamiane przy każdym kolejnym żądaniu bez konieczności ponownej kompilacji.

Tak właśnie działa to w środowisku produkcyjnym. Podczas rozwoju szablony Latte są rekompilowane za każdym razem, gdy zmienia się ich zawartość, więc programista zawsze widzi aktualną wersję.