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

Така лейаутът и отделните страници могат необезпокоявано да използват всички тагове и променливи, само върху шаблона 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