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