Sandbox

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'}

Таким чином, layout та окремі сторінки можуть безперешкодно використовувати всі теги та змінні, лише до шаблону untrusted.latte будуть застосовані обмеження.

Деякі порушення, як-от використання забороненого тегу або фільтра, виявляються під час компіляції. Інші, наприклад, виклик недозволених методів об'єкта, лише під час виконання. Шаблон також може містити будь-які інші помилки. Щоб із sandbox-шаблону не міг вискочити виняток, який порушить весь рендеринг, можна визначити власний обробник винятків, який, наприклад, його залогує.

Якщо ми хочемо увімкнути режим sandbox безпосередньо для всіх шаблонів, це легко зробити:

$latte->setSandboxMode();

Щоб бути впевненими, що користувач не вставить у сторінку PHP-код, який хоч і синтаксично правильний, але заборонений і спричинить PHP Compile Error, рекомендуємо перевіряти шаблони за допомогою PHP linter. Цю функціональність ви вмикаєте методом Engine::enablePhpLint(). Оскільки для перевірки потрібно викликати бінарний файл PHP, передайте шлях до нього як параметр:

$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');
версія: 3.0