Schon von früh auf wird einem PHP-Programmierer beigebracht, das Sprachkonstrukt eval zu meiden. Dieses führt einen als String übergebenen PHP-Code aus und behandelt diesen wie regulären Code des Projekts. Bereits die PHP-Dokumentation führt aus, dass von der Verwendung dringend abgeraten wird.
Die Gefahr, die in eval steckt, lässt sich sehr einfach darstellen:
SQL is evil
Noch nie gehört? Das liegt wohl auch daran, dass kaum jemand diese Aussage trifft.
Abgesehen davon, dass es wohl bisher keinen Grund gab, dieses Sprachkonstrukt einzusetzen, sollte jeder es sich mehrmals überlegen, ob eval eingesetzt werden soll und ob eher das erstellte Konzept nochmals überdacht werden muss.
Eine Alternative zum Ausführen von „Code“
Sollte es doch einmal dazu kommen, dass eine Benutzereingabe wie Code ausgeführt werden muss, kann auf die ExpressionLanguage von Symfony 2 zurückgegriffen werden. Der Programmierer kann selbst bestimmen, auf welche PHP Objekte und Variablen der Anwender über die Expression zugreifen darf.
<?php use SymfonyComponentExpressionLanguageExpressionLanguage; $exprLang = new ExpressionLanguage(); $foo = array( 'val1' => 2,
'val2' => 4,
'val3' => 8,
);
// Expression of a user
$expr = '"sum of val1 and val2 = " ~ (foo["val1"] + foo["val2"])';
echo $exprLang->evaluate($expr, array(
'foo' => $foo,
));
Ausgabe:
sum of val1 and val2 = 6
Über die Expression kann ausschließlich auf das Array $foo zugegriffen werden, da zur Ausführung über die Methode evaluate() nur dieses der Expression zur Verfügung gestellt wird. Andere Variablen aus PHP sind für die Expression nicht verwendbar.
„Brauche ich das?“
In so ziemlich jedem Fall ist der Einsatz von eval gar nicht notwendig und sollte auch vermieden werden. Selbst wenn der Entwickler in der initialen Umsetzung das Feature zu 100% sicher gestalten hat, können spätere Änderungen durch andere Programmierer eine Sicherheitslücke öffnen. Und bevor sich der Entwickler wegen jeder Änderung im Code den Kopf zerbrechen muss, ob diese eine neue Lücke öffnet, verzichtet man lieber auf den Einsatz von eval.
Wer musste schon einmal auf eval zurückgreifen und warum? Schreibt in die Kommentare, wenn ihr schon einmal eval produktiv eingesetzt und wieso ihr euch dafür entschieden habt es einzusetzen.
0 Kommentare