Template Engine mit PHP? Sicherheit? eval?

10/02/2014 - 20:54 von Christian | Report spam
Hallo,

ich möchte eine relativ kleine PHP-Anwendung in Model und View
aufteilen. Das soll heißen ein Teil macht die eigentliche
Datenverarbeitung, der andere ist für die HTML-Ausgabe zustàndig.

Jetzt habe ich allerdings festgestellt, dass ich auch in dem Teil, der
die Ausgabe macht, PHP-Code brauche. Vor allem für Schleifen.

Das heißt aber, dass ich meine HTML-Templates mit eval einbinden muss.
Im Web habe ich solche Konstrukte gefunden wie:

eval(' ?>'.$htmlandphp.'<?php ');

eval() sollte man aus Sicherheitsgründen aber nicht verwenden. Was
passiert, wenn in meinem Template eine Variable ist, die
Benutzereingaben enthàlt? Wie kann ich verhindern, dass Schadcode
eingefügt wird? Ein Template System wie Smarty verwenden? Gibt es eines,
das auf sichere Weise PHP-Code in den Templates erlaubt und keine eigene
Sprache verwendet?

Gruß,
Christian
 

Lesen sie die antworten

#1 Thomas PointedEars Lahn
10/02/2014 - 21:49 | Warnen spam
Christian wrote:
^^^^^^^^^
Bitte reparieren, Christian Nr. 1701.

ich möchte eine relativ kleine PHP-Anwendung in Model und View
aufteilen. Das soll heißen ein Teil macht die eigentliche
Datenverarbeitung, der andere ist für die HTML-Ausgabe zustàndig.

Jetzt habe ich allerdings festgestellt, dass ich auch in dem Teil, der
die Ausgabe macht, PHP-Code brauche. Vor allem für Schleifen.

Das heißt aber, dass ich meine HTML-Templates mit eval einbinden muss.



Nein, das heisst es nicht.

Im Web habe ich solche Konstrukte gefunden wie:

eval(' ?>'.$htmlandphp.'<?php ');



Autsch.

eval() sollte man aus Sicherheitsgründen aber nicht verwenden.



*Unter anderem* deshalb.

Was passiert, wenn in meinem Template eine Variable ist, die
Benutzereingaben enthàlt? Wie kann ich verhindern, dass Schadcode
eingefügt wird?



So jedenfalls nicht. Weiteres findest Du im Abschnitt “Security” des PHP-
Handbuchs. Auch wertvoll: <https://owasp.org/>

Ein Template System wie Smarty verwenden?



Das ist eine Möglichkeit. Unbedingt nötig ist es aber nicht. PHP heisst
nicht umsonst ausgeschrieben[tm] “PHP Hypertext Preprocessor”. Du kannst
also einfach

<html>

<?php
/* PHP-Code, der eine Ausgabe erzeugt */
?>

</html>

schreiben.

Dabei solltest Du nur die Logik zur Erzeugung der Werte so weit wie sinnvoll
möglich in den Controller bzw. das Model verlagern (vollstàndig heisst es
MVC – Model–View–*Controller* –, das Designmuster besteht also aus *drei*
Komponenten). Üblicherweise wird im Template eine Methode der View-Klasse
aufgerufen, welche ggf. formatiert einen Wert in der View-Instanz liefert,
der vorher im Controller zugewiesen wurde. Vereinfachtes Beispiel:

[…Controller.php]-

<?php

namespace …;

class IndexController extends …Controller implements …
{
// …

protected function indexAction ()
{
$model = new …Model();
$model->load(Application::getParam('id'));

$this->assign('foo', $model->bar);

/* Include des untenstehenden Templates */
$this->render();
}

// …
}

[…/index.phtml]


<html>

<?= $this->escape($this->foo); ?>

</html>

Gibt es eines, das auf sichere Weise PHP-Code in den Templates erlaubt und
keine eigene Sprache verwendet?



AFAIK ergànzt Smarty PHP und ersetzt es nicht. Wenn man Smarty debuggt
(BTDT), merkt man, dass die von Smarty aus Smarty-Templates generierten
Templates einfach PHP-Scripts sind, die Bereiche wie im obigen Beispiel
enthalten.

PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Ähnliche fragen