Песочница
Песочница предоставляет уровень безопасности, который дает вам контроль над тем, какие теги, 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 Compile
Error, рекомендуется проверять
шаблоны с помощью PHP-линтера. Эту функциональность вы включите
методом Engine::enablePhpLint()
. Поскольку для проверки требуется
вызывать бинарный файл PHP, передайте путь к нему в качестве
параметра:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');