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.

6voto

Tom Punkte 307

Es stellt ein mögliches Sicherheitsrisiko dar, hat einen anderen Ausführungsbereich und ist ziemlich ineffizient, da es eine völlig neue Skriptumgebung für die Ausführung des Codes schafft. Siehe hier für weitere Informationen: eval .

Sie ist jedoch recht nützlich und kann bei maßvollem Einsatz eine Menge nützlicher Funktionen bieten.

5voto

MarkR Punkte 60862

Das ist nicht unbedingt schlecht, vorausgesetzt, man weiß, in welchem Kontext man es verwendet.

Wenn Ihre Anwendung Folgendes verwendet eval() um ein Objekt aus JSON zu erstellen, das von einer XMLHttpRequest auf Ihrer eigenen Website, die von Ihrem vertrauenswürdigen serverseitigen Code erstellt wurde, ist das wahrscheinlich kein Problem.

Nicht vertrauenswürdiger client-seitiger JavaScript-Code kann ohnehin nicht viel ausrichten. Vorausgesetzt, das Ding, das Sie ausführen eval() aus einer vernünftigen Quelle stammt, ist alles in Ordnung.

5voto

John Topley Punkte 110122

Wenn Sie nicht zu 100 % sicher sind, dass der ausgewertete Code aus einer vertrauenswürdigen Quelle stammt (in der Regel Ihre eigene Anwendung), ist dies ein todsicherer Weg, Ihr System einem Cross-Site-Scripting-Angriff auszusetzen.

4voto

12345678 Punkte 244

Wenn Sie die Verwendung von eval() in Ihrem Code entdecken, denken Sie an das Mantra "eval() ist böse".

Diese Funktion nimmt eine beliebige Zeichenkette und führt sie als JavaScript-Code aus. Wenn der betreffende Code vorher bekannt ist (und nicht erst zur Laufzeit ermittelt wird), gibt es keinen Grund, die Funktion eval() zu verwenden. Wenn der Code dynamisch zur Laufzeit generiert wird, gibt es oft einen besseren Weg, das Ziel das Ziel ohne eval() zu erreichen. Zum Beispiel ist die Verwendung der eckigen Klammer-Notation für auf dynamische Eigenschaften zuzugreifen, ist besser und einfacher:

// antipattern
var property = "name";
alert(eval("obj." + property));

// preferred
var property = "name";
alert(obj[property]);

Verwendung von eval() hat auch Auswirkungen auf die Sicherheit, da Sie möglicherweise Code ausführen (für (z. B. aus dem Netz) ausführen, der manipuliert wurde. Dies ist ein häufiges Problem beim Umgang mit einer JSON-Antwort aus einer Ajax-Anfrage. In diesen Fällen ist es besser, die in den Browsern eingebauten Methoden zum Parsen der JSON-Antwort zu verwenden, um sicherzustellen um sicherzustellen, dass sie sicher und gültig ist. Bei Browsern, die keine Unterstützung für JSON.parse() nativ, können Sie eine Bibliothek von JSON.org verwenden.

Es ist auch wichtig, daran zu denken, dass die Übergabe von Strings an setInterval() , setTimeout() , und die Function() Konstruktor ist größtenteils ähnlich wie die Verwendung von eval() und daher sollte vermieden werden.

Hinter den Kulissen muss JavaScript immer noch Folgendes auswerten und ausführen die Zeichenkette auswerten und ausführen, die Sie als Programmiercode übergeben:

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);

Die Verwendung des new Function()-Konstruktors ist ähnlich wie eval() und sollte wie folgt angegangen werden mit Vorsicht behandelt werden. Er kann ein mächtiges Konstrukt sein, wird aber oft falsch verwendet. Wenn Sie unbedingt verwenden Sie eval() verwenden, können Sie stattdessen new Function() verwenden.

Es gibt ein kleines Potenzial Vorteil, denn der in new Function() ausgewertete Code wird in einem lokalen Funktionsbereich Bereich laufen wird, so dass alle Variablen, die mit var im ausgewerteten Code definiert sind, nicht automatisch zu automatisch zu globalen Variablen.

Eine andere Möglichkeit, automatische Globals zu verhindern, besteht darin, die eval() Aufruf in eine unmittelbare Funktion.

3voto

David Plumpton Punkte 1908

Dies verringert Ihr Vertrauen in die Sicherheit erheblich.

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