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');