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.
Es wäre hilfreich, wenn Sie beschreiben könnten, warum Sie die Variablen auf diese Weise speichern? – Cfreak
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? –
Gibt es einen Grund, warum Sie nicht tun können: '$ foo =" \ $ etwas, $ somethingElse ";' –