Wann ist eval böse in PHP?

84

In all den Jahren, die ich in PHP entwickelt habe, habe ich immer gehört, dass das Verwenden eval()böse ist.

Wäre es angesichts des folgenden Codes nicht sinnvoll, die zweite (und elegantere) Option zu verwenden? Wenn nicht, warum?

// $type is the result of an SQL statement
// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string
$type = "enum('a','b','c')";

// possibility one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// possibility two
eval('$result = '.preg_replace('#^enum#','array', $type).';');
Pierre Spring
quelle
2
eval ist IMMER böse, es gibt immer eine bessere Möglichkeit, Code zu schreiben, insbesondere seit PHP anonyme Funktionen eingeführt hat. In diesem Fall würde ich$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);
Geoffrey
Ehrlich gesagt denke ich, dass das Hauptproblem bei PHP nicht die Sprache selbst ist, sondern die Leute, die es benutzen. Die drei richtigen Antworten auf diese Frage (Thomasrutter, Braincracking und meine) wurden alle abgelehnt, ohne dass jemand etwas dagegen hatte. Auf der anderen Seite behauptet eine Antwort, dass "Manchmal ist eval () die einzige / die richtige Lösung" ohne Beispiel oder Erklärung und wird dafür mit Top-Stimmen bewertet ...
Francois Bourgeois

Antworten:

133

Ich würde vorsichtig sein, wenn ich eval () als reines Übel bezeichne. Die dynamische Auswertung ist ein leistungsstarkes Werkzeug und kann manchmal lebensrettend sein. Mit eval () kann man Mängel von PHP umgehen (siehe unten).

Die Hauptprobleme mit eval () sind:

  • Mögliche unsichere Eingabe. Das Übergeben eines nicht vertrauenswürdigen Parameters kann fehlschlagen. Es ist oft keine triviale Aufgabe, sicherzustellen, dass ein Parameter (oder ein Teil davon) vollständig vertrauenswürdig ist.
  • Trickiness. Die Verwendung von eval () macht Code clever und daher schwieriger zu befolgen. Um Brian Kernighan zu zitieren: "Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code also so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen. "

Das Hauptproblem bei der tatsächlichen Verwendung von eval () ist nur eines:

  • Unerfahrene Entwickler, die es ohne ausreichende Berücksichtigung verwenden.

Als Faustregel neige ich dazu, Folgendes zu befolgen:

  1. Manchmal ist eval () die einzige / richtige Lösung.
  2. In den meisten Fällen sollte man etwas anderes ausprobieren.
  3. Wenn Sie sich nicht sicher sind, gehen Sie zu 2.
  4. Sonst sei sehr, sehr vorsichtig.
Michał Rudnicki
quelle
4
Dies könnte überarbeitet werden, um eval () ebenfalls zu vermeiden, insbesondere wenn $ className auf der Whitelist steht, was für die Verwendung von eval () erforderlich ist. Eine gute Nachricht ist jedoch, dass ab 5.3 $ foo :: bar () gültig ist.
Rojoca
@rojoca: Können Sie uns bitte ein Beispiel geben, wie es ohne eval () in PHP 5.2 geht?
Michał Rudnicki
30
Ich bin nicht sicher, ob es als eval zählt oder nicht, aber $ result = call_user_func (array ('Foo', 'bar')); klappt wunderbar.
Ionuț G. Stan
3
Guter Punkt zur Trickyness - in Ihrem (einfachen) Beispiel erscheint eine Variable "aus dem Nichts". Wenn der Code nur ein bisschen komplexer wird, viel Glück für die nächste Person, die sich den Code ansieht und versucht, diese Variable zu verfolgen (war dort, habe das getan, alles, was ich bekam, waren Kopfschmerzen und dieses miese T-Shirt).
Piskvor verließ das Gebäude
Die unsichere Eingabe ist vermeidbar
Powerlies
40

eval ist böse, wenn nur die geringste Möglichkeit besteht, dass Benutzereingaben in der ausgewerteten Zeichenfolge enthalten sind. Wenn Sie ohne Inhalte von einem Benutzer auswerten, sollten Sie sicher sein.

Trotzdem sollten Sie mindestens zweimal überlegen, bevor Sie eval verwenden. Es sieht täuschend einfach aus, aber mit Blick auf die Fehlerbehandlung (siehe VBAssassins-Kommentar), die Debugbarkeit usw. ist es nicht mehr so ​​einfach.

Als Faustregel also: Vergiss es. Wenn eval die Antwort ist, stellen Sie wahrscheinlich die falsche Frage! ;-);

Patrick Cornelissen
quelle
6
Manchmal ist eval die Antwort. Wir arbeiten an Online-Spieleanwendungen und es ist sehr schwierig, dort Auswertungen zu vermeiden, da die Beziehungen zwischen den Entitäten sehr komplex sind ... aber IMHO ist in 90% der Fälle eine Auswertung nicht die Antwort.
Jet
19
Ich wäre wirklich neugierig auf eine Situation, in der NUR Eval die Antwort ist.
Ionuț G. Stan
2
@Ionut G. Stan Von der Datenbank gespeicherte benutzerdefinierte Trigger für Objekte / Entitäten?
Kuroki Kaze
8
Ich kaufe nicht wirklich, dass eine davon eine berechtigte Verwendung von eval () ist. In jedem Fall ist es immer noch möglich, dasselbe ohne eval () zu tun. Es ist nicht so, dass PHP ohne eval () verkrüppelt ist. Zugegeben, eval () ist in solchen Fällen eine Verknüpfung, aber es macht Ihren Codepfad immer noch ein bisschen schwieriger zu folgen und Probleme ein bisschen schwieriger zu debuggen. Das ist meine Meinung.
Thomasrutter
4
@Christian: SIE sollten zuerst ein Beispiel schreiben (verwenden Sie pastebin.com und fügen Sie den Link hier ein), wo Sie denken, dass eval()es unmöglich ist, die Verwendung von zu vermeiden. Dies ist ein besserer Ansatz. Viele Leute sagen, dass dies eval()in einigen Fällen unvermeidlich ist, aber sie erwähnen keine konkreten Beispiele, die wir argumentieren könnten - auf diese Weise macht diese Debatte keinen Sinn. Also bitte, Leute, die sagen eval(), dass es unvermeidlich ist, beweisen es zuerst!
Sk8erPeter
18

eval () ist zu jeder Zeit gleich böse.

"Wann ist eval () nicht böse?" ist meiner Meinung nach die falsche Frage, denn es scheint zu implizieren, dass die Nachteile der Verwendung von eval () in einigen Kontexten auf magische Weise verschwinden.

Die Verwendung von eval () ist im Allgemeinen eine schlechte Idee, da dadurch die Lesbarkeit des Codes, die Möglichkeit, den Codepfad (und mögliche Auswirkungen auf die Sicherheit) vor der Laufzeit vorherzusagen, und damit die Fähigkeit zum Debuggen von Code verringert werden. Die Verwendung von eval () kann auch verhindern, dass der ausgewertete Code und der ihn umgebende Code durch einen Opcode-Cache wie den in PHP 5.5 und höher integrierten Zend Opcache oder durch einen JIT-Compiler wie den in HHVM optimiert werden.

Darüber hinaus gibt es keine Situation, für die es unbedingt erforderlich ist, eval () zu verwenden - PHP ist ohne es eine voll funktionsfähige Programmiersprache.

Ob Sie diese tatsächlich als Übel ansehen oder in einigen Fällen die Verwendung von eval () persönlich rechtfertigen können, liegt bei Ihnen. Für einige sind die Übel zu groß, um sie jemals zu rechtfertigen, und für andere ist eval () eine praktische Abkürzung.

Wenn Sie jedoch eval () als böse ansehen, ist es jederzeit böse. Es verliert nicht auf magische Weise seine Bösartigkeit je nach Kontext.

thomasrutter
quelle
1
Du machst einen verdammt guten Programmierer.
Christian
1
"Darüber hinaus gibt es keine Situation, für die die Verwendung von eval () unbedingt erforderlich ist." - Was ist, wenn ich Code ausführen möchte, den ich in einer Datenbank gespeichert habe, wie in den PHP-Dokumenten angegeben?
Yarin
4
Dazu würde ich sagen, dass das Speichern von PHP-Code in der Datenbank ebenso böse und ebenso unnötig ist. Was auch immer Sie erreichen möchten, es gibt andere Möglichkeiten, dies zu tun, als PHP in der Datenbank zu speichern oder eval () zu verwenden. Tun Sie es, wenn Sie möchten und wenn es eine hilfreiche Verknüpfung für Sie ist, aber wenn Sie eval () als böse behandeln, müssen Sie das Speichern von PHP in der Datenbank wahrscheinlich auch als böse behandeln.
Thomasrutter
12
Es wird ein weiterer Angriffsvektor hinzugefügt - eine SQL-Injection kann dann auch beliebigen PHP-Code auf dem Webserver ausführen. Es erfordert die Verwendung von eval (). Es kann nicht durch Bytecode-Caches optimiert werden. Es verstößt gegen das Prinzip der Trennung von Code und Daten. Dies kann dazu führen, dass Ihre Anwendung weniger portabel ist. Um das PHP zu aktualisieren / zu reparieren, müssen Sie auch die Datenbank aktualisieren.
Thomasrutter
3
Ich würde sagen, wenn etwas nur durch eval erreicht werden kann, ist es vielleicht gut, das etwas zu überdenken. Das dynamische Erstellen von Klassen zur Laufzeit scheint eine schlechte Idee zu sein. Warum nicht eine Codegenerierung einsetzen und den Code, der sie definiert, im Voraus generieren?
Thomasrutter
15

In diesem Fall ist eval wahrscheinlich sicher genug, solange ein Benutzer niemals beliebige Spalten in einer Tabelle erstellen kann.

Eleganter ist es allerdings nicht. Dies ist im Grunde ein Problem beim Parsen von Text, und der Missbrauch des PHP-Parsers scheint etwas hackig zu sein. Wenn Sie Sprachfunktionen missbrauchen möchten, missbrauchen Sie den JSON-Parser. Zumindest mit dem JSON-Parser gibt es überhaupt keine Möglichkeit der Code-Injektion.

$json = str_replace(array(
    'enum', '(', ')', "'"), array)
    '',     '[', ']', "'"), $type);
$result = json_decode($json);

Ein regulärer Ausdruck ist wahrscheinlich der naheliegendste Weg. Sie können einen einzelnen regulären Ausdruck verwenden, um alle Werte aus dieser Zeichenfolge zu extrahieren:

$extract_regex = '/
    (?<=,|enum\()   # Match strings that follow either a comma, or the string "enum("...
    \'      # ...then the opening quote mark...
    (.*?)       # ...and capture anything...
    \'      # ...up to the closing quote mark...
    /x';
preg_match_all($extract_regex, $type, $matches);
$result = $matches[1];
BlackAura
quelle
1
Auch wenn dies die Frage an sich nicht beantwortet hat, ist dies eine sehr gute Antwort auf die Frage: Was wäre der beste Weg, um eine Aufzählung zu analysieren ()… danke;)
Pierre Spring
13

eval() ist langsam, aber ich würde es nicht böse nennen.

Es ist der schlechte Gebrauch, den wir davon machen, der zur Code-Injektion führen und böse sein kann.

Ein einfaches Beispiel:

$_GET = 'echo 5 + 5 * 2;';
eval($_GET); // 15

Ein harmloses Beispiel:

$_GET = 'system("reboot");';
eval($_GET); // oops

Ich würde Ihnen raten, nicht zu verwenden, eval()aber wenn Sie dies tun, stellen Sie sicher, dass Sie alle Eingaben validieren / auf die Whitelist setzen.

Alix Axel
quelle
12

Wenn Sie fremde Daten (z. B. Benutzereingaben) innerhalb der Auswertung verwenden.

In Ihrem obigen Beispiel ist dies kein Problem.

GreenieMeanie
quelle
7

Ich werde den Inhalt hier offen stehlen:

  1. Eval wird von Natur aus immer ein Sicherheitsbedenken sein.

  2. Neben Sicherheitsbedenken hat eval auch das Problem, unglaublich langsam zu sein. In meinen Tests unter PHP 4.3.10 ist es 10-mal langsamer als normaler Code und 28-mal langsamer unter PHP 5.1 Beta1.

blog.joshuaeichorn.com: using-eval-in-php

Stefs
quelle
5

eval()ist immer böse.

  • aus Sicherheitsgründen
  • aus Leistungsgründen
  • aus Gründen der Lesbarkeit / Wiederverwendbarkeit
  • aus IDE- / Tool-Gründen
  • aus Debugging-Gründen
  • Es gibt immer einen besseren Weg
Francois Bourgeois
quelle
@bracketworks: Aber Sie liegen falsch - all diese inhärenten Probleme verschwinden in manchen Situationen nicht auf magische Weise. Warum sollten sie? Nehmen wir zum Beispiel die Leistung: Glauben Sie wirklich, dass der Interpreter die extrem langsame Funktion eval () mit erhöhter Geschwindigkeit ausführen wird, nur weil Sie sie auf mystische "nicht böse" Weise verwendet haben? Oder funktioniert das schrittweise Debuggen an einem glücklichen Tag in Ihrer Bewertungsklausel?
Francois Bourgeois
3
Ehrlich gesagt denke ich, dass @ MichałRudnickis Antwort es am besten sagt. Versteh mich nicht falsch, wenn ich ( mir ) eine Frage stelle und die Antwort lautet eval(): Ich würde genauso schnell annehmen, dass ich die Frage falsch gestellt habe. selten ist es die "richtige" Antwort, aber im pauschalen Zustand ist es immer böse, es ist einfach falsch.
Dan Lugg
Wenn ich den Code in der Datenbank speichern möchte? Wie kann ich es ausführen?
Konstantin XFlash Stratigenas
@KonstantinXFlashStratigenas Sie sollten sich fragen, warum Sie ausführbaren Code in einer Datenbank speichern. Eine Datenbank enthält Daten, die aus Ihrem Code resultieren - nicht aus Ihrem Code. Zumindest erhöhen Sie die Angriffsvektoren.
Jack B
4

Ich würde auch die Leute berücksichtigen, die Ihren Code pflegen.

eval () ist nicht einfach anzusehen und zu wissen, was passieren soll. Ihr Beispiel ist nicht so schlecht, aber an anderen Orten kann es ein richtiger Albtraum sein.


quelle
4

Persönlich denke ich, dass Code immer noch ziemlich böse ist, weil Sie nicht kommentieren, was er tut. Es testet auch nicht seine Eingaben auf Gültigkeit, was es sehr zerbrechlich macht.

Ich bin auch der Meinung, dass 95% (oder mehr) der Eval-Anwendungen aktiv gefährlich sind und die geringe potenzielle Zeitersparnis, die sie in anderen Fällen bieten könnte, es nicht wert ist, sich der schlechten Praxis der Verwendung zu widmen. Außerdem müssen Sie Ihren Schergen später erklären, warum Ihre Verwendung von eval gut und ihre schlecht ist.

Und natürlich sieht dein PHP wie Perl aus;)

Es gibt zwei Hauptprobleme bei eval () (als "Injektionsangriff" -Szenario):

1) Es kann Schaden anrichten. 2) Es kann einfach abstürzen

und eine, die mehr sozial als technisch ist:

3) Es wird Leute dazu verleiten, es unangemessen als Abkürzung an anderer Stelle zu verwenden

Im ersten Fall laufen Sie Gefahr (natürlich nicht, wenn Sie eine bekannte Zeichenfolge bewerten), dass beliebiger Code ausgeführt wird. Ihre Eingaben sind jedoch möglicherweise nicht so bekannt oder fest wie Sie denken.

Wahrscheinlicher (in diesem Fall) stürzt Sie einfach ab und Ihre Zeichenfolge wird mit einer unbegründet undurchsichtigen Fehlermeldung beendet. Meiner Meinung nach sollte der gesamte Code so ordentlich wie möglich fehlschlagen. Andernfalls sollte eine Ausnahme ausgelöst werden (als die am besten behandelbare Form des Fehlers).

Ich würde vorschlagen, dass Sie in diesem Beispiel eher durch Zufall als durch Verhalten codieren. Ja, die SQL-Enum-Anweisung (und sind Sie sicher, dass das Feld enum ist? - Haben Sie das richtige Feld der richtigen Tabelle der richtigen Version der Datenbank aufgerufen? Hat sie tatsächlich geantwortet?) Sieht in PHP wie eine Array-Deklarationssyntax aus. Ich würde jedoch vorschlagen, dass Sie nicht den kürzesten Weg von der Eingabe zur Ausgabe finden, sondern die angegebene Aufgabe angehen:

  • Stellen Sie fest, dass Sie eine Aufzählung haben
  • Extrahieren Sie die innere Liste
  • Entpacken Sie die Listenwerte

Das ist ungefähr die Option, die Sie wählen, aber ich würde einige Wenn und Kommentare aus Gründen der Klarheit und Sicherheit umschließen (z. B. wenn die erste Übereinstimmung nicht übereinstimmt, eine Ausnahme auslösen oder ein Nullergebnis setzen).

Es gibt immer noch einige mögliche Probleme mit Kommas oder Anführungszeichen, und Sie sollten die Daten wahrscheinlich entpacken und dann in Anführungszeichen setzen, aber Daten werden zumindest als Daten und nicht als Code behandelt.

Mit der preg_version ist Ihr schlechtestes Ergebnis wahrscheinlich $ result = null, mit der eval-Version ist das schlechteste unbekannt, aber zumindest ein Absturz.

Parsingphase
quelle
3

eval wertet eine Zeichenfolge als Code aus. Das Problem dabei ist, dass die Zeichenfolge, wenn sie in irgendeiner Weise "verdorben" ist, enorme Sicherheitsbedrohungen aufdecken kann. Normalerweise liegt das Problem in einem Fall vor, in dem Benutzereingaben in der Zeichenfolge ausgewertet werden. In vielen Fällen könnte der Benutzer Code eingeben (z. B. PHP oder SSI), der dann in eval ausgeführt wird. Er wird mit denselben Berechtigungen wie Ihr PHP-Skript ausgeführt und kann verwendet werden, um Informationen / Zugriff auf Ihren Server zu erhalten. Es kann ziemlich schwierig sein, sicherzustellen, dass Benutzereingaben ordnungsgemäß bereinigt werden, bevor sie an eval übergeben werden. Es gibt andere Probleme, von denen einige umstritten sind

Toby
quelle
3

PHP empfiehlt, dass Sie Ihren Code so schreiben, dass er über call_user_func ausgeführt werden kann, anstatt explizite Auswertungen vorzunehmen.

Nolte
quelle
2

Ein weiterer evalböser Grund ist, dass es nicht von PHP-Bytecode-Caches wie eAccelertor oder ACP zwischengespeichert werden konnte.

TheHippo
quelle
2

Es ist eine schlechte Programmierung, die eval () böse macht, nicht die Funktion. Ich benutze es manchmal, da ich es in der dynamischen Programmierung auf mehreren Sites nicht umgehen kann. Ich kann nicht, dass PHP an einer Site analysiert wird, da ich nicht die gewünschten Dinge erhalte. Ich würde nur ein Ergebnis erhalten! Ich bin froh, dass eine Funktion wie eval () existiert, da sie mein Leben viel einfacher macht. Benutzereingabe? Nur schlechte Programmierer werden von Hackern gefesselt. Darüber mache ich mir keine Sorgen.

Igor M. - PortalPress.org
quelle
2

Es ist eine schlechte Programmierung, die eval () böse macht, nicht die Funktion. Ich benutze es manchmal, da ich es in der dynamischen Programmierung auf mehreren Sites nicht umgehen kann. Ich kann nicht, dass PHP an einer Site analysiert wird, da ich nicht die gewünschten Dinge erhalte. Ich würde nur ein Ergebnis erhalten! Ich bin froh, dass eine Funktion wie eval () existiert, da sie mein Leben viel einfacher macht. Benutzereingabe? Nur schlechte Programmierer werden von Hackern gefesselt. Darüber mache ich mir keine Sorgen.

Ich gehe davon aus, dass Sie bald ernsthafte Probleme haben werden ...

Ehrlich gesagt gibt es absolut keine gute Verwendung für eine exorbitante Funktion wie eval in einer interpretierten Sprache wie PHP. Ich habe noch nie gesehen, dass eval Programmfunktionen ausführt, die auf andere, sicherere Weise nicht ausgeführt werden konnten ...

Eval ist die Wurzel allen Übels, da stimme ich voll und ganz allen Menschen zu, die glauben, dass das Testen von Benutzereingaben hilfreich sein wird. Überlegen Sie zweimal, Benutzereingaben können in vielen verschiedenen Formen erfolgen, und während wir sprechen, nutzen Hacker diese Funktion, die Ihnen nicht wichtig genug war. Vermeiden Sie meiner Meinung nach die Bewertung ganz.

Ich habe handgefertigte Beispiele gesehen, um die Bewertungsfunktion zu missbrauchen, die meine eigene Kreativität übertraf. Vermeiden Sie aus Sicherheitsgründen um jeden Preis, und ich würde sogar so weit gehen, zu fordern, dass es zumindest eine Option in der PHP-Konfiguration ist und keine "gegebene".

Braincracking
quelle
Die Argumentation "Egal wie sorgfältig Sie versuchen, Ihren Code in Bezug auf Feature X zu sichern, Smart Hacker sind immer einen Schritt voraus ..." könnte auf jede andere Technik angewendet werden, nicht nur auf X == eval. Und deshalb ist X: X für jedes Feature die Wurzel allen Eval ... ähm ... Bösen, also geben Sie die Programmierung besser ganz auf (und ziehen Sie so den Teppich unter diesen albernen Hackern hervor und überlisten Sie sie schließlich immer noch).
Gr.
"Es gibt absolut keinen guten Nutzen für eine exorbitante Funktion wie eval" -> Jeder, der Wörter wie 'absolut' verwenden kann, ist entweder neu in der Programmierung oder ein schlechter Programmierer.
Unity100
2

Hier ist eine Lösung zum Ausführen von PHP-Code aus einer Datenbank ohne Verwendung von eval. Ermöglicht alle Funktionen und Ausnahmen des Gültigkeitsbereichs:

$rowId=1;  //database row id
$code="echo 'hello'; echo '\nThis is a test\n'; echo date(\"Y-m-d\");"; //php code pulled from database

$func="func{$rowId}";

file_put_contents('/tmp/tempFunction.php',"<?php\nfunction $func() {\n global \$rowId;\n$code\n}\n".chr(63).">");

include '/tmp/tempFunction.php';
call_user_func($func);
unlink ('/tmp/tempFunction.php');

Grundsätzlich erstellt es eine eindeutige Funktion mit dem in einer Textdatei enthaltenen Code, schließt die Datei ein, ruft die Funktion auf und entfernt die Datei, wenn sie damit fertig ist. Ich verwende dies, um tägliche Datenbankaufnahmen / Synchronisierungen durchzuführen, bei denen für jeden Schritt eindeutiger Code erforderlich ist, um verarbeitet zu werden. Dies hat alle Probleme gelöst, mit denen ich konfrontiert war.

Jason
quelle
Dies sieht aus wie eine Antwort auf eine Antwort. Bitte poste es als solches, wenn du kannst.
Rfornal
1

Früher habe ich oft eval () verwendet, aber in den meisten Fällen muss eval nicht verwendet werden, um Tricks auszuführen. Nun, Sie haben call_user_func () und call_user_func_array () in PHP. Es ist gut genug, um jede Methode statisch und dynamisch aufzurufen.

Um einen statischen Aufruf durchzuführen, erstellen Sie Ihren Rückruf als Array ('Klassenname', 'Methodenname') oder sogar als einfache Zeichenfolge wie 'Klassenname :: Methodenname'. Verwenden Sie zum Ausführen eines dynamischen Aufrufs einen Rückruf im Array-Stil ($ object, 'method').

Die einzig sinnvolle Verwendung von eval () ist das Schreiben eines benutzerdefinierten Compilers. Ich habe eins gemacht, aber eval ist immer noch böse, weil es so verdammt schwer zu debuggen ist. Das Schlimmste ist, dass der schwerwiegende Fehler im ausgewerteten Code den Code zum Absturz bringt, der ihn aufgerufen hat. Ich habe die Parsekit PECL-Erweiterung verwendet, um zumindest die Syntax zu überprüfen, aber immer noch keine Freude - versuchen Sie, auf unbekannte Klassen- und ganze App-Abstürze zu verweisen.

Harry
quelle
0

Abgesehen von Sicherheitsbedenken kann eval () nicht kompiliert, optimiert oder im Opcode zwischengespeichert werden, daher ist es immer langsamer - viel langsamer - als normaler PHP-Code. Es ist daher nicht performant, eval zu verwenden, obwohl das es nicht böse macht. ( gotoist böse, evalist nur schlechte Praxis / stinkender Code / hässlich)

Aron Cederholm
quelle
evalbekommt eine niedrigere böse Bewertung als goto? Ist es entgegengesetzter Tag?
JLRishe
Es ist nur so, dass ich einen Groll gegen die PHP-Entwickler habe, weil sie tatsächlich gotoin 5.3 implementiert haben .
Aron Cederholm
1
gotoNein , zu den Fobianern: Es gibt die Werkzeuge und es gibt die Handwerker, die sie benutzen (oder nicht). Es sind nie die Werkzeuge, die einen Profi wie einen Idioten aussehen lassen, wenn er Fehler macht, sondern die Unfähigkeit, die richtigen Werkzeuge (richtig) zu verwenden. Aber es sind immer die Werkzeuge, die schuld sind ...
Gr.
0

Die meisten Leute werden darauf hinweisen, dass es gefährlich sein kann, wenn Sie mit Benutzereingaben arbeiten (mit denen man umgehen kann).

Für mich ist das Schlimmste, dass es die Wartbarkeit Ihres Codes verringert :

  • Schwer zu debuggen
  • Schwer zu aktualisieren
  • Beschränkt die Verwendung von Tools und Helfern (wie IDEs)
thepowerlies
quelle