Пясъчник
Latte има бронирана крепост под капака на двигателя. Той се нарича режим “пясъчник” и е важна функция, която защитава приложенията, използващи шаблони от ненадеждни източници. Например, когато са редактирани от самите потребители.
Режимът “пясъчник” гарантира, че пясъкът няма да падне от кутията. По този начин се осигурява ограничен достъп до тагове, филтри, функции, методи и др. Как работи? Просто определяме какво искаме да разрешим в шаблона. В началото всичко е забранено и постепенно даваме разрешения:
Следният код позволява на шаблона да използва таговете {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();