Sandbox
Die Sandbox bietet eine Sicherheitsschicht, die Ihnen die Kontrolle darüber gibt, welche Tags, PHP-Funktionen, Methoden usw. in Templates verwendet werden dürfen. Dank des Sandbox-Modus können Sie sicher mit Kunden oder externen Programmierern an der Erstellung von Templates zusammenarbeiten, ohne befürchten zu müssen, dass die Anwendung beschädigt wird oder unerwünschte Operationen ausgeführt werden.
Wie funktioniert das? Wir definieren einfach, was dem Template alles erlaubt ist. Dabei ist standardmäßig alles verboten, und
wir erlauben nach und nach mehr. Mit dem folgenden Code erlauben wir dem Template-Autor, die Tags {block}
,
{if}
, {else}
und {=}
zu verwenden, was das Tag für die Ausgabe einer Variablen oder eines Ausdrucks ist, sowie alle Filter:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
Weiterhin können wir einzelne Funktionen, Methoden oder Eigenschaften von Objekten erlauben:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Ist das nicht erstaunlich? Sie können auf sehr niedriger Ebene absolut alles kontrollieren. Wenn das Template versucht, eine
nicht erlaubte Funktion aufzurufen oder auf eine nicht erlaubte Methode oder Eigenschaft zuzugreifen, endet dies mit einer
Ausnahme Latte\SecurityViolationException
.
Eine Policy von Grund auf zu erstellen, bei der absolut alles verboten ist, mag nicht bequem sein, daher können Sie von einer sicheren Basis ausgehen:
$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();
Sichere Basis bedeutet, dass alle Standard-Tags erlaubt sind außer contentType
, debugbreak
,
dump
, extends
, import
, include
, layout
, php
,
sandbox
, snippet
, snippetArea
, templatePrint
, varPrint
,
widget
. Erlaubt sind die Standardfilter außer datastream
, noescape
und
nocheck
. Und schließlich ist der Zugriff auf Methoden und Eigenschaften des Objekts $iterator
erlaubt.
Die Regeln werden auf das Template angewendet, das wir mit dem Tag {sandbox}
einfügen. Dies ist eine Art Analogon zu
{include}
, das jedoch den sicheren Modus einschaltet und auch keine Variablen übergibt:
{sandbox 'untrusted.latte'}
Layout und einzelne Seiten können also ungestört alle Tags und Variablen verwenden, nur auf das Template
untrusted.latte
werden die Einschränkungen angewendet.
Einige Verstöße, wie die Verwendung eines verbotenen Tags oder Filters, werden zur Kompilierungszeit erkannt. Andere, wie der Aufruf nicht erlaubter Methoden eines Objekts, erst zur Laufzeit. Das Template kann auch beliebige andere Fehler enthalten. Damit Ihnen aus dem sandboxed Template keine Ausnahme entweichen kann, die das gesamte Rendering stört, kann ein eigener Ausnahme-Handler definiert werden, der sie beispielsweise protokolliert.
Wenn wir den Sandbox-Modus direkt für alle Templates aktivieren möchten, geht das einfach:
$latte->setSandboxMode();
Um sicherzustellen, dass der Benutzer keinen PHP-Code in die Seite einfügt, der zwar syntaktisch korrekt ist, aber verboten
ist und einen PHP Compile Error verursacht, empfehlen wir, Templates vom PHP-Linter überprüfen zu lassen.
Diese Funktionalität aktivieren Sie mit der Methode Engine::enablePhpLint()
. Da zur Überprüfung die
PHP-Binärdatei aufgerufen werden muss, übergeben Sie den Pfad dorthin als Parameter:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/pfad/zu/php');