Nette Documentation Preview

syntax
Sandbox
*******

.[perex]
A Sandbox egy olyan biztonsági réteget biztosít, amely lehetővé teszi, hogy ellenőrizze, mely címkék, PHP-funkciók, metódusok stb. használhatók a sablonokban. A sandbox módnak köszönhetően biztonságosan együttműködhet egy ügyféllel vagy külső kódolóval a sablonok létrehozásában anélkül, hogy aggódnia kellene az alkalmazás veszélyeztetése vagy nem kívánt műveletek miatt.

Hogyan működik? Egyszerűen meghatározzuk, hogy mit szeretnénk engedélyezni a sablonban. Kezdetben minden tiltott, és fokozatosan adjuk meg az 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 |tags#Printing] szolgáló címke) és az összes szűrő használatát:

```php
$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:

```php
$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:

```php
$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}` |tags#Including Templates] 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:

```latte
{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 |develop#exception handler], amely például csak naplózza azt.

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

```php
$latte->setSandboxMode();
```

Annak biztosítása érdekében, hogy a felhasználó ne illesszen be olyan PHP-kódot az oldalba, amely szintaktikailag helyes, de tiltott, és PHP-fordítási hibát okoz, javasoljuk, hogy a [sablonokat a PHP-interrel ellenőriztesse |develop#Checking Generated Code]. Ezt a funkciót az Engine::enablePhpLint() metódus segítségével aktiválhatja. Mivel az ellenőrzéshez meg kell hívnia a PHP binárisát, adja meg annak elérési útvonalát paraméterként:

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

Sandbox

A Sandbox egy olyan biztonsági réteget biztosít, amely lehetővé teszi, hogy ellenőrizze, mely címkék, PHP-funkciók, metódusok stb. használhatók a sablonokban. A sandbox módnak köszönhetően biztonságosan együttműködhet egy ügyféllel vagy külső kódolóval a sablonok létrehozásában anélkül, hogy aggódnia kellene az alkalmazás veszélyeztetése vagy nem kívánt műveletek miatt.

Hogyan működik? Egyszerűen meghatározzuk, hogy mit szeretnénk engedélyezni a sablonban. Kezdetben minden tiltott, és fokozatosan adjuk meg az 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();

Annak biztosítása érdekében, hogy a felhasználó ne illesszen be olyan PHP-kódot az oldalba, amely szintaktikailag helyes, de tiltott, és PHP-fordítási hibát okoz, javasoljuk, hogy a sablonokat a PHP-interrel ellenőriztesse. Ezt a funkciót az Engine::enablePhpLint() metódus segítségével aktiválhatja. Mivel az ellenőrzéshez meg kell hívnia a PHP binárisát, adja meg annak elérési útvonalát paraméterként:

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