2010-08-15 5 views
5

Ich habe eine Zeichenfolge, die einige Variablen speichert, die ein Ergebnis, zum Beispiel zur Herstellung ausgeführt werden müssen:Was kann ich anstelle von eval() verwenden?

$foo = eval("return ".RUN_THIS.";"); 

Ich verstehe, dass eval unsicher ist, wenn:

define('RUN_THIS', '\$something.",".$somethingElse'); 

Welche -uated ist dann eval() Die Zeichenfolge, die ausgewertet wird, stammt aus Benutzereingaben. Wenn ich zum Beispiel alles von Facebooks HipHop laufen lassen wollte, was eval() nicht unterstützt, konnte ich das nicht tun.

Anscheinend kann ich call_user_func() verwenden - ist das effektiv das gleiche Ergebnis wie eval()? Was gilt als sicher, wenn eval() nicht gilt, wenn dies tatsächlich der Fall ist?

Bearbeiten: Als Antwort auf die Kommentare, habe ich ursprünglich nicht klar, was das Ziel ist. Die Konstante wird im Voraus definiert, damit späterer Code, sei es innerhalb einer Klasse, die Zugriff auf die Konfigurationskonstanten hat, oder prozeduraler Code diese verwenden kann, um die angegebene Variablenfolge auszuwerten. Die Variablen, die ausgewertet werden müssen, können je nach Situation variieren (völlig unterschiedliche Namen, Reihenfolge, Formatierung), aber sie werden für den gleichen Zweck auf dieselbe Weise ausgeführt, weshalb ich die Variablenfolge in einer Konstanten in dieser Variable habe Weg. Technisch ist eval() nicht unsicher, solange die config.php, die die Konstanten definiert, kontrolliert wird, aber das war nicht der Punkt der Frage.

+9

Es wäre hilfreich, wenn Sie beschreiben könnten, warum Sie die Variablen auf diese Weise speichern? – Cfreak

+2

Ja, das klingt ein bisschen wie ein Designfehler. Können Sie nicht ein abstrakteres "RUN_THIS" definieren (eines, das keinen tatsächlichen Code enthält), das zu einem späteren Zeitpunkt im Code geparst wird? –

+1

Gibt es einen Grund, warum Sie nicht tun können: '$ foo =" \ $ etwas, $ somethingElse ";' –

Antwort

2

Kendall scheint a simple solution zu haben, aber ich werde versuchen, Ihre andere Frage zu beantworten:

Anscheinend kann ich call_user_func() - ist dies effektiv das gleiche Ergebnis wie eval()? Wie wird es als sicher angesehen, wenn eval() nicht ist, wenn dies tatsächlich der Fall ist?

call_user_funcist tatsächlich sicherer als eval aufgrund der Tatsache, dass call_user_func nur eine Benutzerfunktion aufrufen können. eval führt andererseits die Zeichenfolge als PHP-Code selbst aus. Sie können '; (schließen Sie die Zeichenfolge und starten Sie eine neue "Zeile") am Ende der Zeichenfolge und fügen Sie dann noch mehr Code, fügen Sie eine ;' (Ende der Codezeile und starten Sie eine andere Zeichenfolge, so dass es keine Syntax Fehler), wodurch die konstante RUN_THIS so dass viele PHP-Code enthalten, die der Benutzer auf dem Server (einschließlich Löschen Sie alle Ihre wichtigen Dateien und Abrufen von Informationen für Datenbanken usw. NIE geschehen lassen. doesn

call_user_func laufen kann Wenn Sie call_user_func_array($func, $args) ausführen, kann der Benutzer nur eingeschränkte Funktionen ausführen, weil: (a) die Funktion benutzerdefiniert sein muss (b) Sie können $func manipulieren, um sicherzustellen, dass der Benutzer keine davon ausführen kann Funktion er/sie will entweder per Scheck dass $func in einer Liste von "erlaubten Funktionen" ist oder indem man den Funktionsnamen und der $func Variable selbst so etwas wie user_ voranstellt (Auf diese Weise kann der Benutzer nur Funktionen ausführen, die mit user_ beginnen.

+1

'exec'! =' Eval' –

+0

Ich weiß. Wenn ich etwas nicht verpasst habe, rede ich eigentlich von 'eval', nicht' exec'. – Umang

+0

Lesen Sie Ihren Beitrag erneut, "' call_user_func' ist eigentlich sicherer als ** 'exec' ** weil ...". –

1

Ich kann keinen Grund sehen, warum Sie nicht einfach doppelte Anführungsstring Gebäude verwenden können.

$foo = "\$something,$somethingElse";