5 Stimmen

Sollte ich eval() oder call_user_func() verwenden?

Ich arbeite an einem PHP-Projekt, und ich möchte Code ausführen, der aus einer MySQL-Datenbank abgerufen wird. Es gibt keine Chance, dass unsicherer Code eingeschleust wird, also ist das einzige, worüber ich mir Sorgen mache, die Performance. Sollte ich eval() verwenden, so dass ich den Code direkt ausführen kann, oder parsen Sie es so, dass call_user_func() es stattdessen ausführt?

Wenn der von mir abgerufene Code zum Beispiel "myfunc(1,2,3); anotherFunc(3,2,1);" lautet
Ich kann eval() direkt ausführen, um den Code auszuführen.

Aber für call_user_func() müsste ich den String parsen, damit er ausgeführt werden kann. Welche Funktion ist also in diesem Fall besser geeignet?

0 Stimmen

Entschuldigung für die Bearbeitung, aber ich bekomme solche Ide

0 Stimmen

S

0 Stimmen

T

4voto

thomasrutter Punkte 109036

Die Speicherung von PHP in der Datenbank ist an sich schon ein schlechter Entwurfsgeruch; auch wenn Sie in diesem Fall ziemlich sicher sind, dass sie niemals unsicheren Code enthalten kann, ist es immer gut, die Anzahl der Annahmen oder Abwehrmaßnahmen zu minimieren, die Sie treffen müssen. Wenn Sie PHP-Code in der Datenbank speichern, wird ein Angriff, bei dem sich ein Angreifer Zugang zu Ihrer Datenbank verschafft, schnell sehr viel ernster und wird zu einem Angriff, bei dem ein Angreifer beliebigen Code ausführen kann! Ich weiß, dass ein solcher Angriff auf Ihre Datenbank sehr unwahrscheinlich ist, aber dennoch ist es eine gute Sicherheitspraxis, Ihr System selbst in einer unwahrscheinlichen Situation nicht mehr als nötig zu gefährden.

Viele Menschen stimmen zu dass eval() in PHP-Code immer und ausnahmslos vermieden werden sollte. Es gibt immer eine Alternative.

In diesem Fall würde ich jedoch sagen, dass die Verwendung von eval() die beste Lösung für Sie wäre, da Sie bereits PHP-Code in der DB speichern, so dass die Verwendung von eval() Ihr Risiko nicht noch weiter erhöht.

Ich würde jedoch empfehlen, dass

  1. Sie versuchen, den Code zu überprüfen, bevor Sie ihn eval(), indem Sie konservativ in dem, was Sie erlauben. Nehmen Sie an, dass ein Angreifer irgendwie in Ihre Datenbank eingedrungen ist, auch wenn das unwahrscheinlich ist.
  2. Sie sollten zumindest ernsthaft darüber nachdenken, Ihre Anwendung so umzuschreiben, dass der PHP-Code nicht in einer Datenbank gespeichert wird. Wenn Sie komplexe Datenstrukturen speichern, sollten Sie stattdessen über etwas wie JSON oder sogar XML nachdenken. Hierfür gibt es sichere Parser.

Es tut mir leid, wenn diese Antwort ein wenig reaktionär erscheint; ich halte diese Art von Fragen einfach für sehr wichtig.

2voto

J.C. Inacio Punkte 4332

In der Regel versuche ich immer, so weit wie möglich von eval() entfernt zu bleiben. Dieser Fall scheint jedoch ein guter Kandidat dafür zu sein.

Sie sagen "Es besteht keine Gefahr, dass unsicherer Code eingeschleust wird. Die große Frage ist also: Besteht die Möglichkeit, dass sich ein nicht funktionierender Code in der Datenbank befindet?

Wenn nicht, eval() ist die Lösung, aber wenn es dann ordnungsgemäße Parsing und Fehlerprotokollierung/etc könnte eine sicherere Wette sein. (ich glaube, die Verwendung von call_user_func_array() ist theoretisch schneller, so dass jeder Parsing-Overhead vernachlässigbar werden könnte)

1voto

Todd R Punkte 17676

Ich würde denken, dass Parsing würde Overhead hinzufügen, aber der einzige Weg, Sie können sicher sein, ist, um Tests es laufen. Probieren Sie beide Möglichkeiten mit verschiedenen Funktionen aus und sehen Sie, was Ihre Ergebnisse sind. Verwenden Sie Code, der das darstellt, was Sie zu speichern erwarten.

Viel Glück!

1voto

soulmerge Punkte 70900

Verwenden Sie eval(). Alles andere ist den Aufwand nicht wert - sie hätten keine positiven Nebeneffekte.

1voto

Bob Fanger Punkte 26489

Sie sollten einen Blick auf die runkit Erweiterung, die php in einer Sandbox ausführen kann, ohne den laufenden Code zu beeinträchtigen.

Wenn der Code Auswirkungen auf den laufenden Code haben soll, sollten Sie eval() verwenden.

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