Peskovnik
Peskovnik zagotavlja varnostno plast, ki omogoča nadzor nad tem, katere oznake, funkcije PHP, metode itd. se lahko uporabljajo v predlogah. Zahvaljujoč načinu peskovnika lahko pri ustvarjanju predlog varno sodelujete s stranko ali zunanjim programerjem, ne da bi vas skrbelo ogrožanje aplikacije ali neželene operacije.
Kako deluje? Preprosto določimo, kaj želimo dovoliti v predlogi. Na začetku je vse prepovedano, nato pa postopoma
dodeljujemo dovoljenja. Naslednja koda dovoli predlogi uporabo oznak {block}
, {if}
, {else}
in {=}
(slednja je oznaka za izpis spremenljivke ali izraza) ter 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();
Če želite zagotoviti, da uporabnik na stran ne vstavi kode PHP, ki je sintaktično pravilna, vendar prepovedana in povzroči napako pri sestavljanju PHP, priporočamo, da se predloge preverijo s programskim vmesnikom PHP. To funkcijo lahko aktivirate z metodo Engine::enablePhpLint(). Ker mora za preverjanje poklicati binarni program PHP, kot parameter podajte njegovo pot:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');