Bezpečnost především
Kontextově sensitivní escapování
Byť je Cross Site Scripting (XSS) jedním z nejtriviálnějších způsobů narušení webových stránek, jde o zranitelnost nejčastější. Přitom velmi závažnou, protože může vést k zcizení identity a podobně. Obranou je důsledné escapování vypisovaných dat, tj. převod znaků majících v daném kontextu speciální význam na jiné odpovídající sekvence.
Pokud kodér na escapování zapomene, vznikne v aplikaci bezpečnostní díra. Proto šablonovací systémy začínají přicházet s automatickým escapováním. Problém je ale v tom, že na webové stránce existují různé kontexty a v každém je potřeba ošetřit vypisované proměnné trošku jinak. Může tak vzniknou bezpečnostní díra i kvůli špatně zvolené escapovací funkci.
Latte je však dál. Disponuje unikátní technologií Kontextově sensitivní escapování (Context-Aware Escaping), která rozezná, ve které části dokumentu se značka nachází a podle toho zvolí správné escapování. Co to znamená?
Že v Latte není potřeba nic manuálně ošetřovat. Vše se děje automaticky, správně a důsledně. Nemusíte se bát bezpečnostních děr.
Podívejme se, jak to funguje. Vytvoříme si šablonu:
<p onclick="alert({$movie})">{$movie}</p>
<script>var movie = {$movie};</script>
Pokud bude proměnná $movie
obsahovat řetězec 'Amarcord & 8 1/2'
, vygeneruje se následující
výstup. Všimněte si, že uvnitř HTML se použije jiné escapování, než uvnitř JavaScriptu a ještě jiné v atributu
onclick
:
<p onclick="alert("Amarcord & 8 1\/2")">Amarcord & 8 1/2</p>
<script>var movie = "Amarcord & 8 1\/2";</script>
Díky kontextově sensitivnímu escapování je šablona jednoduchá a vaše aplikace přitom bude perfektně zabezpečená proti Cross Site Scripting. Dokonce je možné zcela nativně používat PHP proměnné uvnitř JavaScriptu!
Kontrola odkazů
Latte automaticky kontroluje, zda proměnná použitá v atributech src
nebo href
obsahuje webovou
URL (tj. protokol HTTP) a předchází vypsání odkazů, které mohou představovat bezpečnostní riziko.
{var $link = 'javascript:attack()'}
<a href="{$link}">klikni</a>
Vypíše:
<a href="">klikni</a>
Kontrola se dá vypnout pomocí filtru noCheck.