Пісочниця
У 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
.
Деякі порушення, як-от використання забороненого тега або фільтра, виявляються під час компіляції. Інші, такі як виклик недозволених методів об'єкта, – під час виконання. Шаблон також може містити будь-які інші помилки. Щоб запобігти викиду винятку з шаблону, що знаходиться в пісочниці, який порушує весь рендеринг, ви можете визначити власний обробник винятків, який, наприклад, просто реєструє його.
Якщо ми хочемо ввімкнути режим пісочниці безпосередньо для всіх шаблонів, то це просто:
$latte->setSandboxMode();