Peskovnik (Sandbox)
Peskovnik zagotavlja varnostno plast, ki vam daje nadzor nad tem, katere oznake, funkcije PHP, metode ipd. se lahko uporabljajo v predlogah. Zahvaljujoč načinu peskovnika lahko varno sodelujete s stranko ali zunanjim kodirnikom pri ustvarjanju predlog, ne da bi se morali bati, da bo prišlo do vdora v aplikacijo ali neželenih operacij.
Kako deluje? Enostavno definiramo, kaj vse bomo predlogi dovolili. Pri čemer je v osnovi vse prepovedano in postopoma
dovoljujemo. Z naslednjo kodo omogočimo avtorju predloge uporabo oznak {block}
, {if}
,
{else}
in {=}
, kar je oznaka za izpis
spremenljivke ali izraza in vse filtre:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
Nadalje lahko dovolimo posamezne funkcije, metode ali lastnosti objektov:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Ni to čudovito? Lahko na zelo nizki ravni nadzorujete popolnoma vse. Če predloga poskuša poklicati nedovoljeno funkcijo ali
dostopati do nedovoljene metode ali lastnosti, se konča z izjemo Latte\SecurityViolationException
.
Ustvarjati politiko od točke nič, ko je prepovedano popolnoma vse, morda ni udobno, zato lahko začnete od varne osnove:
$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();
Varna osnova pomeni, da so dovoljene vse standardne oznake razen contentType
, debugbreak
,
dump
, extends
, import
, include
, layout
, php
,
sandbox
, snippet
, snippetArea
, templatePrint
, varPrint
,
widget
. Dovoljeni so standardni filtri razen datastream
, noescape
in nocheck
.
In končno je dovoljen dostop do metod in lastnosti objekta $iterator
.
Pravila se uporabljajo za predlogo, ki jo vstavimo z oznako {sandbox}
. Kar je nekakšna analogija
{include}
, ki pa vklopi varni način in tudi ne posreduje nobenih spremenljivk:
{sandbox 'untrusted.latte'}
Torej lahko postavitev in posamezne strani nemoteno uporabljajo vse oznake in spremenljivke, samo za predlogo
untrusted.latte
bodo veljale omejitve.
Nekatere kršitve, kot je uporaba prepovedane oznake ali filtra, se odkrijejo v času prevajanja. Druge, kot na primer klicanje nedovoljenih metod objekta, šele med izvajanjem. Predloga lahko vsebuje tudi kakršne koli druge napake. Da vam iz peskovniške predloge ne bi mogla skočiti izjema, ki bi prekinila celotno izrisovanje, lahko definirate lasten obdelovalnik izjem po meri, ki jo na primer zabeleži.
Če bi želeli način peskovnika vklopiti neposredno za vse predloge, je to enostavno:
$latte->setSandboxMode();
Da bi bili prepričani, da uporabnik v stran ne bo vstavil kode PHP, ki je sicer sintaktično pravilna, vendar prepovedana in
povzroči PHP Compile Error, priporočamo, da pustite predloge preverjati s PHP linterjem. To
funkcionalnost vklopite z metodo Engine::enablePhpLint()
. Ker za preverjanje potrebuje klicati binarno datoteko PHP,
pot do nje posredujte kot parameter:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');