eval

Pherseus

Erfahrenes Mitglied
Ich hab irgendwo mal gelesen, dass man auf eval möglichst ganz verzichten soll. Weis aber nicht mehr den Grund. Ist das wirklich so das eval am ebsten nicht benutz wird und wenn ja warum?

Oder ist das egal und ich kann das ruhig benutzen. Das würde in meinen Klassen nähmlich einiges vereinfachen.
 
Bei eval besteht die Möglichkeit, dass jemand eigenen Code in Dein Skript einschleust und damit ganz schön viel Blödsinn machen kann. Vor allem, wenn jemand Dein Skript kennt, wird es sehr leicht, ansonsten geht es halt mit Probieren oder sogar unabsichtlich durch Zufall.
 
Wenn man aber mit


PHP:
 trim(addslashes(htmlspecialchars(strip_tags($variable))));

voher die Variablen überprüft, dürfte das doch nicht gehen oder?
 
Was hat das damit zu tun?
[phpf]eval[/phpf] führt PHP-Code aus. Die Funktionen, die Du ansprichst, manipulieren Strings, in erster Linie HTML-Code bzw. Zeichenketten zur Ausgabe.
Das kann ein Angreifer antizipieren und seinen Code entsprechend anpassen.
Größer-/Kleinervergleiche sind dann zwar nicht mehr möglich, aber z.B. die Anweisung [phpf]system[/phpf] betrifft das nicht. Wenn Du durch Stringmanipulation verhinderst, dass der Code, den Du [phpf]eval[/phpf] übergibst, nicht ausgeführt werden kann, weil er kein Code mehr ist, dann hilft Dir die Funktion ja auch nicht mehr. Wenn Du nur statischen Text übergibst, brauchst Du eval nicht.
 
Mal abgesehen davon, das eval() Bösewichten eine Angriffsfläche bietet, ist derartige Programmierung in meinen Augen extrem unsauber... nur so als weiterer Grund, die Finger von dieser Funktion zu lassen.
 
Also zum verständniserkläre ichmal, wie ich eval verwende:

In einer klasse habe ich verschiedene Funktion um Strings zu überprüfen. Dies heisen dann z.B.

check_email(), check_length(), check_.....

Zur vereinfachung habe ich dann eine weitere Funktion check, die dann die einzelnen funktion mit eval aufruft und zwar ungefähr so hier

PHP:
function check($check,$value)
  {
     eval('$function =check_'.$check.'(" '.$value.' ");');
  }


$check ist dabei eine Variable die von mir Übergeben wird, also kann dort kein "böser" Code drin sein.

$value wäre dann eine Variable die der User aus einem Forumlar übergibt. Diese Variable wird allerdings wie Oben beschrieben vorher Überprüft. Also dürfte dort auch kein "böser Code" enthalten sein. Oder sehe ich da etwas falsch oder Verwende ich eval falsch? Vielleicht hat jemand auch eine einfache Lösung. Funktionieren tut es zumindestens.

Das mit dem unsauber kann ich nicht ganz nachvollziehen. Bei der Benutzung könnte ich natürlich auf eval verzichten, würde allerdings einen um mehrere Zeilen größeren Code haben. Daher die Entscheidung für eval().
 
Ja, in dem Fall würde ich auch besser die Funktion als Inhalt einer Variablen aufrufen.
Wenn Du den Funktionen dann einen Präfix gibst, mit dem nirgend wo anders in Deinem Skript oder in PHP selbst eine Funktion beginnt, solltest Du relativ sicher sein.
Das heißt also, Du solltest nochmal genau überprüfen, ob irgendeine Funktion, außer Deinen, mit "check_" beginnt.
Probleme könnte noch Folgendes verursachen:
Was passiert, wenn der User etwas einschleust, so dass die Funktion nicht existiert?
Das ließe sich umgehen, wenn Du auf Existenz der Funktion prüfst und dann mit "und" den Aufruf der Funktion anhängst.
Was jedoch, wenn der User es schafft, die Kontrolle zu manipulieren, indem er dafür sorgt, dass statt E-Mail die Länge geprüft wird?
Es ist auf jeden Fall sicherer, als eval, aber ebenso, wie das $$-Konstrukt sind alle diese höchstdynamischen Möglichkeiten, die PHP bietet, potenzielle Gefahren.

Gruß hpvw
 
Zurück