Nette Documentation Preview

syntax
Sandbox
*******
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);

$latte->setPolicy($policy);

Továbbá engedélyezhetjük az egyes függvényeket, metódusokat vagy objektumok property-jeit:

$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);

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:

$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();

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:

{sandbox 'untrusted.latte'}

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ő:

$latte->setSandboxMode();

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:

$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');