Пісочниця

У 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();