Sandbox

Latte páncélozott erődítménye közvetlenül a motorháztető alatt. Ezt homokozó módnak hívják, és ez egy fontos funkció, amely megvédi a nem megbízható forrásból származó sablonokat használó alkalmazásokat. Például, amikor azokat maguk a felhasználók szerkesztik.

A homokozó mód gondoskodik arról, hogy a homok ne jusson ki a dobozból. Így korlátozott hozzáférést biztosít a címkékhez, szűrőkhöz, függvényekhez, metódusokhoz stb. Hogyan működik? Egyszerűen meghatározzuk, hogy mit szeretnénk engedélyezni a sablonban. Kezdetben minden tiltott, és fokozatosan adunk engedélyeket:

A következő kód engedélyezi a sablon számára a {block}, {if}, {else} és {=} címkék (ez utóbbi egy változó vagy kifejezés nyomtatására szolgáló címke) és az összes szűrő használatát:

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

$latte->setPolicy($policy);

Az objektumok globális függvényeihez, módszereihez vagy tulajdonságaihoz való hozzáférést is engedélyezhetjük:

$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 irányíthatsz. 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 tulajdonsághoz, akkor kivételt dob Latte\SecurityViolationException.

A házirendek létrehozása a semmiből, amikor minden tiltott, nem biztos, hogy kényelmes, így egy biztonságos alapról indulhat:

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

Ez azt jelenti, hogy minden szabványos címke engedélyezett, kivéve a contentType, debugbreak, dump, extends, import, include, layout, php, sandbox, snippet, snippetArea, templatePrint, varPrint, widget. Az összes szabványos szűrő is megengedett, kivéve a datastream, noescape és nocheck. Végül a $iterator objektum metódusaihoz és tulajdonságaihoz való hozzáférés is engedélyezett.

A szabályok az új sablonra vonatkoznak, amelyet az új {sandbox} címkével. Ami egy olyasmi, mint a {include}, de bekapcsolja a sandbox módot, és nem ad át külső változókat sem:

{sandbox 'untrusted.latte'}

Így az elrendezés és az egyes oldalak ugyanúgy használhatják az összes taget és változót, mint korábban, a korlátozások csak a sablonra vonatkoznak untrusted.latte.

Egyes szabálysértések, például tiltott címkék vagy szűrők használata, már a fordításkor észlelésre kerülnek. Mások, mint például egy objektum nem engedélyezett metódusainak meghívása, futásidőben. A sablon bármilyen más hibát is tartalmazhat. Annak érdekében, hogy a sandboxolt sablonból ne dobjon ki kivételt, ami megzavarja a teljes renderelést, definiálhat saját kivételkezelőt, amely például csak naplózza azt.

Ha közvetlenül az összes sablonra szeretnénk bekapcsolni a sandbox módot, az egyszerű:

$latte->setSandboxMode();