Welche Situationen erfordern die Verwendung von eval (), weil es keine Alternativen gibt?

8

Ich weiß, dass eval in JavaScript aus Geschwindigkeits- und Sicherheitsgründen vermieden werden sollte. Aber im Fall von PHP wird selten Sicherheit jemals erwähnt. Meistens läuft Ihr Programm langsamer, als es sollte, weil eval willkürlich verwendet wird.

In welchen Situationen sollten Sie eval verwenden, weil es keinen anderen Weg gibt?

Aus Gründen der Klarheit:

Wir sprechen nicht über vom Benutzer bereitgestellte Daten. Daher konzentriert sich die Frage auf die reine und vollständig kontrollierte serverseitige gültige Verwendung von eval .

    
user281373 25.02.2010, 17:35
quelle

5 Antworten

10

Die Sicherheitsprobleme von eval -atisierendem Code mit eval in PHP sind die gleichen wie in Javascript: Wenn Sie einen Code auswerten, müssen Sie sicher sein, woher er kommt und was er enthält.

>

Die Sicherheitsimplikationen könnten sogar noch größer sein, da PHP unter anderem Zugriff auf Ihre Datenbank hat - was bedeutet, dass es fast alle Informationen, die Ihre Anwendung benötigt, stehlen / korrumpieren kann!

In Javascript sagen sie, dass "eval ist böse "; es ist wahrscheinlich in PHP so wahr, dass es in Javascript wahr ist.


Nun, zu bestimmten Situationen, in denen Sie eval nicht vermeiden können ... Nun, in etwas wie 4 Jahren Entwicklung in PHP als meine tägliche Arbeit erinnere ich mich nicht, jemals eval in meinem eigenen Code verwendet zu haben ^^

Immer noch, und ein Beispiel für eine Situation, in der eval benötigt wird, wenn Sie beispielsweise Code in der Datenbank speichern und ihn nicht in Dateien zwischenspeichern (die enthalten sein könnten) - das passiert bei manchen CMS, die zum Beispiel die Eingabe von Teilen von PHP-Code in den Administrationsbereich erlauben.

    
Pascal MARTIN 25.02.2010 17:42
quelle
2

Eval und create_function können eine willkürliche Code-Injektion ermöglichen. Es gibt viele Dinge in PHP, die verwendet werden können, um die Sicherheit Ihrer Anwendung zu gefährden.

Wir sagen Kindern, dass sie nicht mit Messern und Streichhölzern spielen sollen - aber diese sind nützliche (wenn nicht sogar essentielle) Werkzeuge, wenn sie richtig benutzt werden. So ist es mit viel PHP-Funktionalität. Es ist nichts an sich falsch, die Funktionalität zu verwenden, solange Sie genau wissen, was Sie tun .

Aber eine Diskussion von Programmiersprachen auf einer so abstrakten Ebene ist nicht das, worum es bei StackOverflow geht.

C.

    
symcbean 25.02.2010 20:14
quelle
0
  

Ich weiß, Eval sollte vermieden werden in   Javascript für Geschwindigkeit und Sicherheit   Gründe dafür. aber im Falle von PHP,   selten wird Sicherheit jemals erwähnt.   öfter läuft dein Programm   langsamer als es sollte wegen   zufälliger Gebrauch von eval.

eval ist böse auch in php.

  

in welchen spezifischen Situationen sollten Sie   benutze eval () weil es kein anderes gibt   Um es herum?

Zuerst versuchen wir zu vermeiden es so viel wie möglich, aber wenn Sie dies für die Ausführung von Code verwenden müssen, dann müssen Sie damit gehen, aber wie gesagt ist es Böses benutzt du auf dein eigenes Risiko .

Untere Zeile:

Lassen Sie niemals zu, dass die Benutzereingabe mit eval ausgeführt wird. (Es sei denn, Sie wissen, was Sie tun / riskieren)

    
Sarfraz 25.02.2010 17:40
quelle
0

ich stimme völlig mit früheren Antworten in dem Punkt überein, dass eval böse ist, und ich benutze es nie in meinem Code.

aber in einer Situation habe ich es nicht geschafft, Eval zu vermeiden. Ich habe nicht viel Erfahrung in PHP, also werde ich mich freuen, wenn mir jemand rät, wie ich den Code ohne "Eval" umschreiben kann. In dieser Situation hatte ich einen Klassennamen in einer Variablen gespeichert, und ich musste eine statische Methode für diese Klasse aufrufen, der Klassenname stammte von einer vertrauenswürdigen Quelle. also musste ich so etwas schreiben:

%Vor%

(weil Sie nicht einfach $ className :: methodname ()) schreiben können;

    
kipelovets 25.02.2010 19:56
quelle
0

Wenn Sie anonyme Funktionen vor PHP 5.3 verwenden möchten, müssen Sie create_function verwenden , die einen eval () - Aufruf umschließt.

    
JW. 25.02.2010 19:57
quelle

Tags und Links