Nette Documentation Preview

syntax
Пісочниця
*********

.[perex]
Пісочниця забезпечує рівень безпеки, який дає вам контроль над тим, які теги, функції PHP, методи тощо можна використовувати в шаблонах. Завдяки режиму пісочниці ви можете безпечно співпрацювати з клієнтом або зовнішнім розробником над створенням шаблону, не турбуючись про компрометацію програми або небажані операції.

Як це працює? Ми просто визначаємо, що ми хочемо дозволити в шаблоні. На початку все заборонено, і ми поступово надаємо дозволи. Наступний код дозволяє шаблону використовувати теги `{block}`, `{if}`, `{else}` і `{=}` (останній - це тег для [друку змінної або виразу |tags#Printing]) і всі фільтри:

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

$latte->setPolicy($policy);
```

Ми також можемо дозволити доступ до глобальних функцій, методів або властивостей об'єктів:

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

Хіба це не дивно? Ви можете контролювати все на дуже низькому рівні. Якщо шаблон намагається викликати несанкціоновану функцію або отримати доступ до несанкціонованого методу чи властивості, він викидає виняток `Latte\SecurityViolationException`.

Створення політик з нуля, коли все заборонено, може бути незручним, тому ви можете почати з безпечного фундаменту:

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

Це означає, що всі стандартні теги дозволені, крім `contentType`, `debugbreak`, `dump`, `extends`, `import`, `include`, `layout`, `php`, `sandbox`, `snippet`, `snippetArea`, `templatePrint`, `varPrint`, `widget`.
Також дозволені всі стандартні фільтри, окрім `datastream`, `noescape` і `nocheck`. Нарешті, доступ до методів і властивостей об'єкта `$iterator` також дозволено.

Ці правила застосовуються до шаблону, який ми вставляємо з новим [`{sandbox}` |tags#Including-Templates] тегом. Це щось на кшталт `{include}`, але в ньому ввімкнено режим пісочниці, а також не передаються зовнішні змінні:

```latte
{sandbox 'untrusted.latte'}
```

Таким чином, макет і окремі сторінки можуть використовувати всі теги і змінні, як і раніше, обмеження накладатимуться тільки на шаблон `untrusted.latte`.

Деякі порушення, як-от використання забороненого тега або фільтра, виявляються під час компіляції. Інші, такі як виклик недозволених методів об'єкта, - під час виконання.
Шаблон також може містити будь-які інші помилки. Щоб запобігти викиду винятку з шаблону, що знаходиться в пісочниці, який порушує весь рендеринг, ви можете визначити [власний обробник винятків |develop#Exception-Handler], який, наприклад, просто реєструє його.

Якщо ми хочемо ввімкнути режим пісочниці безпосередньо для всіх шаблонів, то це просто:

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

Щоб користувач не вставляв на сторінку синтаксично правильний, але заборонений PHP-код, який може спричинити помилку компіляції PHP, ми рекомендуємо [перевіряти шаблони за допомогою лінтера PHP |develop#Checking Generated Code]. Ви можете активувати цю функціональність за допомогою методу Engine::enablePhpLint(). Оскільки для перевірки потрібно викликати бінарний файл PHP, передайте шлях до нього як параметр:

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

Пісочниця

Пісочниця забезпечує рівень безпеки, який дає вам контроль над тим, які теги, функції PHP, методи тощо можна використовувати в шаблонах. Завдяки режиму пісочниці ви можете безпечно співпрацювати з клієнтом або зовнішнім розробником над створенням шаблону, не турбуючись про компрометацію програми або небажані операції.

Як це працює? Ми просто визначаємо, що ми хочемо дозволити в шаблоні. На початку все заборонено, і ми поступово надаємо дозволи. Наступний код дозволяє шаблону використовувати теги {block}, {if}, {else} і {=} (останній – це тег для друку змінної або виразу) і всі фільтри:

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

$latte->setPolicy($policy);

Ми також можемо дозволити доступ до глобальних функцій, методів або властивостей об'єктів:

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

Хіба це не дивно? Ви можете контролювати все на дуже низькому рівні. Якщо шаблон намагається викликати несанкціоновану функцію або отримати доступ до несанкціонованого методу чи властивості, він викидає виняток Latte\SecurityViolationException.

Створення політик з нуля, коли все заборонено, може бути незручним, тому ви можете почати з безпечного фундаменту:

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

Це означає, що всі стандартні теги дозволені, крім contentType, debugbreak, dump, extends, import, include, layout, php, sandbox, snippet, snippetArea, templatePrint, varPrint, widget. Також дозволені всі стандартні фільтри, окрім datastream, noescape і nocheck. Нарешті, доступ до методів і властивостей об'єкта $iterator також дозволено.

Ці правила застосовуються до шаблону, який ми вставляємо з новим {sandbox} тегом. Це щось на кшталт {include}, але в ньому ввімкнено режим пісочниці, а також не передаються зовнішні змінні:

{sandbox 'untrusted.latte'}

Таким чином, макет і окремі сторінки можуть використовувати всі теги і змінні, як і раніше, обмеження накладатимуться тільки на шаблон untrusted.latte.

Деякі порушення, як-от використання забороненого тега або фільтра, виявляються під час компіляції. Інші, такі як виклик недозволених методів об'єкта, – під час виконання. Шаблон також може містити будь-які інші помилки. Щоб запобігти викиду винятку з шаблону, що знаходиться в пісочниці, який порушує весь рендеринг, ви можете визначити власний обробник винятків, який, наприклад, просто реєструє його.

Якщо ми хочемо ввімкнути режим пісочниці безпосередньо для всіх шаблонів, то це просто:

$latte->setSandboxMode();

Щоб користувач не вставляв на сторінку синтаксично правильний, але заборонений PHP-код, який може спричинити помилку компіляції PHP, ми рекомендуємо перевіряти шаблони за допомогою лінтера PHP. Ви можете активувати цю функціональність за допомогою методу Engine::enablePhpLint(). Оскільки для перевірки потрібно викликати бінарний файл PHP, передайте шлях до нього як параметр:

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