Sandbox
Sandbox fornisce un livello di sicurezza che ti dà il controllo su quali tag, funzioni PHP, metodi, ecc. possono essere utilizzati nei template. Grazie alla modalità sandbox, puoi collaborare in sicurezza con il cliente o un codificatore esterno alla creazione dei template, senza doverti preoccupare che l'applicazione venga compromessa o che vengano eseguite operazioni indesiderate.
Come funziona? Semplicemente definiamo tutto ciò che permettiamo al template. Di base, tutto è vietato e noi gradualmente
permettiamo le cose. Con il seguente codice, permettiamo all'autore del template di utilizzare i tag {block}
,
{if}
, {else}
e {=}
, che è il tag per stampare una variabile o un'espressione e tutti i filtri:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
Inoltre, possiamo permettere singole funzioni, metodi o proprietà degli oggetti:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Non è fantastico? Puoi controllare tutto a un livello molto basso. Se il template tenta di chiamare una funzione non
consentita o di accedere a un metodo o proprietà non consentiti, terminerà con un'eccezione
Latte\SecurityViolationException
.
Creare una policy da zero, dove tutto è vietato, potrebbe non essere comodo, quindi puoi iniziare da una base sicura:
$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();
Una base sicura significa che sono consentiti tutti i tag standard tranne contentType
, debugbreak
,
dump
, extends
, import
, include
, layout
, php
,
sandbox
, snippet
, snippetArea
, templatePrint
, varPrint
,
widget
. Sono consentiti i filtri standard tranne datastream
, noescape
e
nocheck
. E infine è consentito l'accesso ai metodi e alle proprietà dell'oggetto $iterator
.
Le regole si applicano al template che inseriamo con il tag {sandbox}
. Che è una sorta di analogo di
{include}
, ma attiva la modalità sicura e non passa alcuna variabile:
{sandbox 'untrusted.latte'}
Quindi il layout e le singole pagine possono utilizzare liberamente tutti i tag e le variabili, solo al template
untrusted.latte
verranno applicate le restrizioni.
Alcune violazioni, come l'uso di un tag o filtro vietato, vengono rilevate in fase di compilazione. Altre, come la chiamata a metodi di oggetti non consentiti, solo in fase di esecuzione. Il template può anche contenere qualsiasi altro errore. Affinché un'eccezione dal template in sandbox non possa interrompere l'intero rendering, è possibile definire un gestore di eccezioni personalizzato, che ad esempio la registrerà.
Se volessimo attivare la modalità sandbox direttamente per tutti i template, è facile:
$latte->setSandboxMode();
Per assicurarti che l'utente non inserisca nella pagina codice PHP che sia sintatticamente corretto ma vietato e causi un PHP
Compile Error, consigliamo di far controllare
i template dal linter PHP. Questa funzionalità si attiva con il metodo Engine::enablePhpLint()
. Poiché per il
controllo è necessario chiamare l'eseguibile PHP, passa il percorso ad esso come parametro:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');