Sandbox
Sandbox oferă un nivel de securitate care vă permite să controlați ce etichete, funcții PHP, metode etc. pot fi utilizate în șabloane. Datorită modului sandbox, puteți colabora în siguranță cu un client sau cu un programator extern la crearea de șabloane, fără a vă face griji cu privire la compromiterea aplicației sau la operațiuni nedorite.
Cum funcționează? Pur și simplu definim ceea ce dorim să permitem în șablon. La început, totul este interzis, iar noi
acordăm treptat permisiuni. Următorul cod permite șablonului să utilizeze etichetele {block}
, {if}
,
{else}
și {=}
(aceasta din urmă este o etichetă pentru imprimarea unei variabile sau expresii) și toate filtrele:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
De asemenea, putem permite accesul la funcții, metode sau proprietăți globale ale obiectelor:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Nu-i așa că este uimitor? Puteți controla totul la un nivel foarte scăzut. Dacă șablonul încearcă să apeleze
o funcție neautorizată sau să acceseze o metodă sau o proprietate neautorizată, se aruncă excepția
Latte\SecurityViolationException
.
Crearea politicilor de la zero, când totul este interzis, poate să nu fie convenabilă, așa că puteți începe de la o bază sigură:
$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();
Aceasta înseamnă că toate etichetele standard sunt permise, cu excepția contentType
, debugbreak
,
dump
, extends
, import
, include
, layout
, php
,
sandbox
, snippet
, snippetArea
, templatePrint
, varPrint
,
widget
. De asemenea, sunt permise toate filtrele standard, cu excepția datastream
,
noescape
și nocheck
. În cele din urmă, este permis și accesul la metodele și proprietățile
obiectului $iterator
.
Regulile se aplică șablonului pe care îl inserăm cu noul {sandbox}
tag. Care este ceva de genul
{include}
, dar activează modul sandbox și, de asemenea, nu trece nicio variabilă externă:
{sandbox 'untrusted.latte'}
Astfel, macheta și paginile individuale pot folosi toate etichetele și variabilele ca și până acum, restricțiile vor fi
aplicate doar șablonului untrusted.latte
.
Unele încălcări, cum ar fi utilizarea unei etichete sau a unui filtru interzis, sunt detectate în momentul compilării. Altele, cum ar fi apelarea unor metode nepermise ale unui obiect, la momentul execuției. Șablonul poate conține, de asemenea, orice alte erori. Pentru a preveni lansarea unei excepții din șablonul sandboxed, care perturbă întreaga redare, puteți defini propriul gestionar de excepții, care, de exemplu, doar o înregistrează.
Dacă dorim să activăm modul sandbox direct pentru toate șabloanele, este simplu:
$latte->setSandboxMode();
Pentru a vă asigura că un utilizator nu inserează în pagină cod PHP corect din punct de vedere sintactic, dar interzis și care provoacă o eroare de compilare PHP, vă recomandăm ca șabloanele să fie verificate de către PHP linter. Puteți activa această funcționalitate folosind metoda Engine::enablePhpLint(). Deoarece trebuie să apeleze binarul PHP pentru verificare, treceți calea acestuia ca parametru:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');