Sandbox

Latte are o fortăreață blindată direct sub capotă. Se numește modul sandbox și este o caracteristică importantă care protejează aplicațiile care utilizează șabloane din surse nesigure. De exemplu, atunci când acestea sunt editate chiar de către utilizatori.

Modul Sandbox se asigură că nisipul nu iese din cutie. Astfel, acesta oferă acces limitat la etichete, filtre, funcții, metode etc. Cum funcționează? Pur și simplu definim ceea ce dorim să permitem în șablon. La început, totul este interzis și 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();