Sandbox

O Sandbox fornece uma camada de segurança que lhe dá controlo sobre quais tags, funções PHP, métodos, etc., podem ser usados nos templates. Graças ao modo sandbox, pode colaborar com segurança com o cliente ou codificador externo na criação de templates, sem ter que se preocupar com a violação da aplicação ou operações indesejadas.

Como funciona? Simplesmente definimos tudo o que permitiremos ao template. Por padrão, tudo é proibido e nós gradualmente permitimos. O código a seguir permite ao autor do template usar as tags {block}, {if}, {else} e {=}, que é a tag para exibição de variável ou expressão, e todos os filtros:

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

$latte->setPolicy($policy);

Além disso, podemos permitir funções, métodos ou propriedades individuais de objetos:

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

Não é incrível? Pode controlar absolutamente tudo num nível muito baixo. Se o template tentar chamar uma função não permitida ou aceder a um método ou propriedade não permitido, ele terminará com uma exceção Latte\SecurityViolationException.

Criar uma política do zero, onde absolutamente tudo é proibido, pode não ser conveniente, então pode começar de uma base segura:

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

A base segura significa que todas as tags padrão são permitidas, exceto contentType, debugbreak, dump, extends, import, include, layout, php, sandbox, snippet, snippetArea, templatePrint, varPrint, widget. Os filtros padrão são permitidos, exceto datastream, noescape e nocheck. E, finalmente, o acesso aos métodos e propriedades do objeto $iterator é permitido.

As regras são aplicadas ao template que inserimos com a tag {sandbox}. Que é uma espécie de análogo ao {include}, mas que ativa o modo seguro e também não passa nenhuma variável:

{sandbox 'untrusted.latte'}

Assim, o layout e as páginas individuais podem usar livremente todas as tags e variáveis, apenas o template untrusted.latte terá restrições aplicadas.

Algumas infrações, como o uso de uma tag ou filtro proibido, são detetadas em tempo de compilação. Outras, como chamar métodos de objeto não permitidos, apenas em tempo de execução. O template também pode conter quaisquer outros erros. Para evitar que uma exceção de um template em sandbox interrompa toda a renderização, pode definir um manipulador de exceções personalizado, que, por exemplo, a registará.

Se quiséssemos ativar o modo sandbox diretamente para todos os templates, é fácil:

$latte->setSandboxMode();

Para ter a certeza de que o usuário não inserirá código PHP na página que seja sintaticamente correto, mas proibido e cause um PHP Compile Error, recomendamos deixar os templates serem verificados pelo linter PHP. Ativa essa funcionalidade com o método Engine::enablePhpLint(). Como ele precisa de chamar o binário PHP para verificação, passe o caminho para ele como parâmetro:

$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');
versão: 3.0