Sandbox
A Sandbox egy biztonsági réteget biztosít, amely lehetővé teszi annak szabályozását, hogy milyen tagek, PHP függvények, metódusok stb. használhatók a sablonokban. A sandbox módnak köszönhetően biztonságosan együttműködhet az ügyféllel vagy külső kódolóval a sablonok létrehozásában anélkül, hogy aggódnia kellene az alkalmazás megsértése vagy nem kívánt műveletek miatt.
Hogyan működik? Egyszerűen definiáljuk, mit engedélyezünk a sablonnak. Alapértelmezés szerint minden tiltva van, és
fokozatosan engedélyezünk dolgokat. A következő kóddal lehetővé tesszük a sablon szerzőjének a {block}
,
{if}
, {else}
és {=}
tagek használatát, ami a változó
vagy kifejezés kiírására szolgáló tag, valamint az összes szűrőt:
Továbbá engedélyezhetjük az egyes függvényeket, metódusokat vagy objektumok property-jeit:
Hát nem csodálatos? Nagyon alacsony szinten mindent ellenőrizhet. Ha a sablon megpróbál meghívni egy nem engedélyezett
függvényt, vagy hozzáférni egy nem engedélyezett metódushoz vagy property-hez, az
Latte\SecurityViolationException
kivételt eredményez.
A policy létrehozása a nulláról, amikor minden teljesen tiltva van, nem biztos, hogy kényelmes, ezért kezdhet egy biztonságos alapról:
A biztonságos alap azt jelenti, hogy minden standard tag engedélyezett, kivéve a contentType
,
debugbreak
, dump
, extends
, import
, include
, layout
,
php
, sandbox
, snippet
, snippetArea
, templatePrint
,
varPrint
, widget
tageket. Minden standard szűrő engedélyezett, kivéve a datastream
,
noescape
és nocheck
szűrőket. Végül engedélyezett a hozzáférés a $iterator
objektum metódusaihoz és property-jeihez.
A szabályok arra a sablonra vonatkoznak, amelyet a {sandbox}
taggel illesztünk be. Ez egyfajta {include}
megfelelője, amely azonban bekapcsolja a biztonságos módot, és nem
ad át semmilyen változót:
Tehát a layout és az egyes oldalak zavartalanul használhatják az összes taget és változót, csak az
untrusted.latte
sablonra vonatkoznak a korlátozások.
Néhány vétség, mint például egy tiltott tag vagy szűrő használata, a fordítási időben derül ki. Mások, mint például egy objektum tiltott metódusának hívása, csak futás közben. A sablon tartalmazhat bármilyen más hibát is. Annak érdekében, hogy a sandboxolt sablonból ne ugorhasson ki olyan kivétel, amely megzavarja az egész megjelenítést, definiálhat egy saját kivételkezelő handler-t, amely például naplózza azt.
Ha a sandbox módot közvetlenül az összes sablonra szeretnénk bekapcsolni, az egyszerűen megtehető:
Annak biztosítása érdekében, hogy a felhasználó ne illesszen be olyan PHP kódot az oldalra, amely ugyan szintaktikailag
helyes, de tiltott és PHP Compile Error-t okoz, javasoljuk, hogy a sablonokat
ellenőriztesse PHP linterrel. Ezt a funkcionalitást az Engine::enablePhpLint()
metódussal kapcsolhatja be.
Mivel az ellenőrzéshez a PHP binárisát kell hívnia, adja át annak elérési útját paraméterként: