Frage

Ich arbeite an einem PHP-Projekt, und ich mag Code auszuführen, die aus einer MySQL-Datenbank geholt ist. Es gibt keine Chance von unsicherem Code injiziert werden, so dass die einzige Sache, die ich über Performace ist besorgt bin. Soll ich eval () verwenden, so kann ich direkt den Code ausführen, oder analysieren es so, dass call_user_func () läuft es stattdessen?

Zum Beispiel, wenn der Code, den ich geholt wurde "myfunc (1,2,3); anotherFunc (3,2,1);"
Ich kann eval () direkt um den Code auszuführen.

Aber für call_user_func (), würde ich habe die Zeichenfolge zu analysieren, so dass es läuft werden kann. So, welches die bessere Funktion ist in diesem Fall zu benutzen?

War es hilfreich?

Lösung

Als allgemeine Regel gilt, ich versuche immer, so weit weg wie möglich von eval () zu bleiben. Dieser Fall ist jedoch sieht aus wie ein guter Kandidat für es.

Sie sagen "Es gibt keine Chance, unsicheren Code eingespritzt" , so ist die große Frage: gibt es eine Chance von unworking Code in der Datenbank zu sein

Wenn nicht, eval () ist die Lösung, aber wenn es dann die richtige Analyse und Fehlerprotokollierung / etc möglicherweise eine sicherere Wette. (Ich glaube mit call_user_func_array () ist schneller in der Theorie, so dass jedes Parsing-Overhead könnte vernachlässigbar)

Andere Tipps

Speichern von PHP in der Datenbank ist ein schlechtes Design Geruch in sich selbst; obwohl auch in diesem Fall, dass Sie ziemlich sicher sind, es nie unsicheren Code enthalten kann, ist es immer gut, um die Anzahl von Annahmen oder Verteidigungen wie zu minimieren, dass Sie zu machen. Wenn Sie PHP-Code in der Datenbank speichern, dann in dem ein Angriff ein Angreifer Zugriff auf Ihre Datenbank wird schnell viel ernster, verwandelt sich in einen Angriff, bei dem ein Angreifer beliebigen Code ausführen kann! Ich weiß, dass Ihre Datenbank kompromittiert zu haben, wie dies sehr unwahrscheinlich ist, aber dennoch ist es eine gute Sicherheit der Praxis nicht einmal eine unwahrscheinliche Situation mehr gefährdet Ihr System zu lassen, als es muss.

Viele Menschen sind sich einig, dass eval () ohne Ausnahme werden soll, vermieden immer, in PHP-Code. Es gibt immer eine Alternative.

In diesem Fall jedoch denke ich, dass ich hätte sagen, dass die Verwendung von eval () wäre die beste Lösung für Sie sein, weil Sie bereits PHP-Code in der DB zu speichern sind, so eval () wird nicht zu erhöht das Risiko weiter als das.

Ich würde jedoch empfehlen, dass

  1. Sie versuchen, den Code zu überprüfen, bevor Sie es mit () eval, von konservativ in dem, was Sie können. Es sei angenommen, dass irgendwie ein Angreifer bekam in Ihre Datenbank auch gedacht, dass ist unwahrscheinlich.
  2. Sie zumindest geben einige ernsthafte Gedanken Ihre Anwendung zu umschreiben, so dass PHP-Code in einer Datenbank gespeichert ist. Wenn Sie komplexe Datenstrukturen speichern, denken über so etwas wie JSON oder sogar XML statt. Sicher Parser existieren für diese.

Es tut mir leid, wenn diese Antwort ein bisschen reaktionär scheint; Ich bin eben so etwas zu fühlen, ist sehr wichtig.

Ich würde denken, dass das Parsen Aufwand hinzufügen würde, aber der einzige Weg, Sie sicher sein können, ist Tests um es auszuführen. Versuchen Sie es in beiden Richtungen mit verschiedenen Funktionen und sehen, was Ihre Ergebnisse sind. Benutzen Sie den Code, der darstellt, was Sie erwarten zu speichern.

Viel Glück!

Mit eval (). Alles andere ist nicht der Mühe wert -. Sie würden keine positive Nebenwirkungen

Sie können einen Blick auf die runkit extention nehmen wollen, die PHP in einer Sandbox ausführen kann nicht bewirken, der Laufcode.

Wenn der Code annehmen, Ihren laufenden Code zu bewirken, für eval gehen ().

Sie sollten den Code wickeln Sie sind auch in einem try / catch-Block zu laufen, falls es einen Fehler (auch wenn Sie sagte, dass es nicht sein wird, gibt es eine Möglichkeit ist, und es ist am besten Praxis)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top