Песочница

Песочница обеспечивает уровень безопасности, который дает вам контроль над тем, какие теги, функции 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');
версия: 3.0