586 Stimmen

Warum ist die Verwendung der JavaScript eval-Funktion eine schlechte Idee?

Die eval-Funktion ist eine leistungsstarke und einfache Möglichkeit, dynamischen Code zu erzeugen.

414voto

Prestaul Punkte 79893
  1. Unsachgemäße Verwendung von eval öffnet Ihr Code für Injektionsangriffe

  2. Fehlersuche kann eine größere Herausforderung sein (keine Zeilennummern, etc.)

  3. eval'd Code wird langsamer ausgeführt (keine Möglichkeit, eval'd Code zu kompilieren/cachen)

Bearbeiten: Wie @Jeff Walden in den Kommentaren anmerkt, trifft Nr. 3 heute weniger zu als noch im Jahr 2008. Auch wenn eine gewisse Zwischenspeicherung von kompilierten Skripten möglich ist, beschränkt sich dies nur auf Skripte, die wiederholt und ohne Änderungen ausgewertet werden. Ein wahrscheinlicheres Szenario ist, dass Sie Skripte evaluieren, die jedes Mal leicht verändert wurden und daher nicht zwischengespeichert werden können. Sagen wir einfach, dass EINIGE eval'd Code langsamer ausgeführt wird.

352voto

bobince Punkte 512550

Das Böse ist nicht immer böse. Es gibt Zeiten, in denen sie vollkommen angemessen ist.

Allerdings wird eval derzeit und in der Vergangenheit von Leuten, die nicht wissen, was sie tun, massiv überstrapaziert. Das schließt leider auch Leute ein, die JavaScript-Tutorials schreiben, und in einigen Fällen kann dies tatsächlich Folgen für die Sicherheit haben - oder, was häufiger vorkommt, einfache Bugs. Je mehr wir also tun können, um eval mit einem Fragezeichen zu versehen, desto besser. Jedes Mal, wenn Sie eval verwenden, müssen Sie überprüfen, was Sie tun, denn die Chancen stehen gut, dass Sie es auf eine bessere, sicherere und sauberere Weise tun könnten.

Um ein allzu typisches Beispiel zu geben, um die Farbe eines Elements mit einer in der Variablen "potato" gespeicherten ID festzulegen:

eval('document.' + potato + '.style.color = "red"');

Hätten die Autoren des obigen Codes eine Ahnung von den Grundlagen der Funktionsweise von JavaScript-Objekten, hätten sie erkannt, dass eckige Klammern anstelle von wörtlichen Punktnamen verwendet werden können, was die Notwendigkeit von eval überflüssig macht:

document[potato].style.color = 'red';

...die viel einfacher zu lesen und weniger fehleranfällig ist.

(Aber das würde jemand sagen, der /wirklich/ weiß, was er tut:

document.getElementById(potato).style.color = 'red';

was zuverlässiger ist als der fragwürdige alte Trick, auf DOM-Elemente direkt aus dem Dokumentobjekt zuzugreifen).

38voto

kemiller2002 Punkte 110605

Ich glaube, das liegt daran, dass es jede JavaScript-Funktion aus einer Zeichenkette heraus ausführen kann. Das macht es für Leute einfacher, bösartigen Code in die Anwendung einzuschleusen.

30voto

Mark Biek Punkte 140395

Es ist im Allgemeinen nur ein Problem, wenn Sie eval Benutzereingaben übergeben.

29voto

xtofl Punkte 39285

Zwei Punkte fallen mir dazu ein:

  1. Sicherheit (aber solange Sie die auszuwertende Zeichenkette selbst generieren, dürfte dies kein Problem sein)

  2. Leistung: Solange der auszuführende Code nicht bekannt ist, kann er nicht optimiert werden. (über Javascript und Leistung, natürlich Steve Yegge's Präsentation )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X