Sandbox
Sandbox oferă un strat de securitate care vă oferă control asupra tag-urilor, funcțiilor PHP, metodelor etc. care pot fi utilizate în șabloane. Datorită modului sandbox, puteți colabora în siguranță cu clientul sau cu un coder extern la crearea șabloanelor, fără a vă teme că aplicația va fi compromisă sau că vor avea loc operațiuni nedorite.
Cum funcționează? Pur și simplu definim ce îi permitem șablonului. În mod implicit, totul este interzis și noi permitem
treptat. Următorul cod permite autorului șablonului să utilizeze tag-urile {block}
, {if}
,
{else}
și {=}
, care este tag-ul pentru afișarea unei variabile sau expresii și toate filtrele:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
În continuare, putem permite funcții, metode sau proprietăți individuale ale obiectelor:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Nu este uimitor? Puteți controla absolut totul la un nivel foarte scăzut. Dacă șablonul încearcă să apeleze o funcție
nepermisă sau să acceseze o metodă sau proprietate nepermisă, se va termina cu o excepție
Latte\SecurityViolationException
.
Crearea unei politici 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();
Baza sigură înseamnă că sunt permise toate tag-urile standard, cu excepția contentType
,
debugbreak
, dump
, extends
, import
, include
, layout
,
php
, sandbox
, snippet
, snippetArea
, templatePrint
,
varPrint
, widget
. Sunt permise filtrele standard, cu excepția datastream
,
noescape
și nocheck
. Și, în final, este permis accesul la metodele și proprietățile obiectului
$iterator
.
Regulile se aplică pentru șablonul pe care îl inserăm cu tag-ul {sandbox}
. Care este un fel de echivalent al
{include}
, dar care activează modul sigur și, de asemenea, nu transmite nicio variabilă:
{sandbox 'untrusted.latte'}
Astfel, layout-ul și paginile individuale pot utiliza nestingherit toate tag-urile și variabilele, doar șablonului
untrusted.latte
i se vor aplica restricții.
Unele încălcări, cum ar fi utilizarea unui tag sau filtru interzis, sunt detectate în timpul compilării. Altele, cum ar fi apelarea metodelor nepermise ale unui obiect, abia în timpul rulării. Șablonul poate conține, de asemenea, orice alte erori. Pentru ca o excepție din șablonul sandboxat să nu poată ieși și să perturbe întreaga randare, puteți defini propriul handler de excepții, care, de exemplu, o va loga.
Dacă am dori să activăm modul sandbox direct pentru toate șabloanele, este ușor:
$latte->setSandboxMode();
Pentru a vă asigura că utilizatorul nu inserează în pagină cod PHP care este sintactic corect, dar interzis și provoacă
o eroare de compilare PHP, vă recomandăm să lăsați șabloanele verificate de linterul PHP. Activați
această funcționalitate prin metoda Engine::enablePhpLint()
. Deoarece pentru verificare trebuie să apeleze binarul
PHP, transmiteți calea către acesta ca parametru:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');