Пясъчник
Sandbox осигурява ниво на сигурност, което ви дава възможност да контролирате кои тагове, PHP функции, методи и т.н. могат да се използват в шаблоните. Благодарение на режима Sandbox можете спокойно да си сътрудничите с клиент или външен програмист при създаването на шаблони, без да се притеснявате, че ще компрометирате приложението или ще извършите нежелани операции.
Как работи? Просто определяме какво искаме да разрешим в шаблона. В
началото всичко е забранено и постепенно даваме разрешения. Следният
код позволява на шаблона да използва таговете {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
.
Някои нарушения, като например използването на забранен таг или филтър, се откриват по време на компилиране. Други, като например извиквания на неразрешени методи на обекти, се откриват по време на изпълнение. Шаблонът може да съдържа и всякакви други грешки. За да предотвратите изхвърлянето на изключение от шаблона в пясъчната кутия, което прекъсва цялото визуализиране, можете да дефинирате свой собствен обработчик на изключение, който например просто да го регистрира.
Ако искаме да активираме режима sandbox директно за всички шаблони, това е лесно:
$latte->setSandboxMode();
За да се гарантира, че потребителят няма да вмъкне в страницата код PHP, който е синтактично правилен, но забранен и предизвиква грешка при компилиране на PHP, препоръчваме шаблоните да се проверяват от PHP лайнтера. Можете да активирате тази функционалност, като използвате метода Engine::enablePhpLint(). Тъй като той трябва да извика двоичния файл на PHP за проверката, подайте пътя до него като параметър:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');