Peskovnik

Latte ima oklepno utrdbo neposredno pod pokrovom motorja. Imenuje se način peskovnika in je pomembna funkcija, ki ščiti aplikacije, ki uporabljajo predloge iz nezaupljivih virov. Na primer, ko jih urejajo uporabniki sami.

Način peskovnika poskrbi, da pesek ne pride iz škatle. Tako zagotavlja omejen dostop do oznak, filtrov, funkcij, metod itd. Kako deluje? Preprosto določimo, kaj želimo dovoliti v predlogi. Na začetku je vse prepovedano in postopoma dodeljujemo dovoljenja:

Naslednja koda dovoli predlogi uporabo oznak {block}, {if}, {else} in {=} (slednja je oznaka za izpis spremenljivke ali izraza) in vseh filtrov:

$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);

$latte->setPolicy($policy);

Dovolimo lahko tudi dostop do globalnih funkcij, metod ali lastnosti predmetov:

$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);

Ali ni to neverjetno? Vse lahko nadzorujete na zelo nizki ravni. Če predloga poskuša poklicati nedovoljeno funkcijo ali dostopati do nedovoljene metode ali lastnosti, vrže izjemo Latte\SecurityViolationException.

Ustvarjanje politik od začetka, ko je vse prepovedano, morda ni primerno, zato lahko začnete z varnimi temelji:

$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();

To pomeni, da so dovoljene vse standardne oznake, razen contentType, debugbreak, dump, extends, import, include, layout, php, sandbox, snippet, snippetArea, templatePrint, varPrint, widget. Prav tako so dovoljeni vsi standardni filtri, razen datastream, noescape in nocheck. Končno je dovoljen tudi dostop do metod in lastnosti objekta $iterator.

Pravila veljajo za predlogo, ki jo vstavimo z novim {sandbox} oznako. Ki je nekaj podobnega kot {include}, vendar vklopi način peskovnika in tudi ne posreduje nobenih zunanjih spremenljivk:

{sandbox 'untrusted.latte'}

Tako lahko postavitev in posamezne strani uporabljajo vse oznake in spremenljivke kot prej, omejitve pa bodo veljale le za predlogo untrusted.latte.

Nekatere kršitve, kot je uporaba prepovedane oznake ali filtra, se zaznajo v času sestavljanja. Druge, kot je klicanje nedovoljenih metod objekta, pa ob izvajanju. Predloga lahko vsebuje tudi katere koli druge napake. Če želite preprečiti, da bi se iz predloge v peskovniku vrgla izjema, ki bi motila celotno izrisovanje, lahko določite svoj lasten obdelovalec izjem, ki jo na primer samo zabeleži.

Če želimo način peskovnika vklopiti neposredno za vse predloge, je to preprosto:

$latte->setSandboxMode();