Zustand mit eval {php}
<?php
eval("if (1==1){");
echo ('abc');
eval("}");
?>
Dann bekomme ich eine Fehlermeldung :
Parse error: Parse error in C:\wamp\www\test\index.php(2) : eval()'d code on line 1
abc
Parse error: Parse error in C:\wamp\www\test\index.php(4) : eval()'d code on line 1
Wie zu beheben?
- Ich möchte ein template egine
- Sie möchten die Verwendung einer template-engine, um eine template-engine?
- Nein. eine template-engine. Meine Frage beantworten Sie bitte
- Snoob, Sie vielleicht gut daran tun, zu schauen, den code für andere template-engines. Sie wohl Ihre Ziele zu erreichen, ohne dass code wie dieser.
- template engine, die Verwendung von eval ist die grausamste Sache, die ein Entwickler sich vorstellen kann. Ich bin mit Ihnen Mitleid haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie wirklich versuchen zu vermeiden, mit
eval
wenn überhaupt möglich. Es stellt eine enorme und fast unüberwindbaren Sicherheits-Risiko. Ich habe noch nie in meiner Karriere ein guter Grund, um diese Funktion zu nutzen. Wenn Sie nach einem Beispiel, vielleicht können wir Ihnen helfen einen Weg finden, um Ihr Ziel zu erreichen, ohne diese immense Gefahr.Haftungsausschluss beiseite, ich denke, das Problem ist, dass Sie anfangen, ein Ausdruck in der
eval
muss abgeschlossen sein.Könnten Sie versuchen, diese stattdessen:
edit:
Ziel ist es, so etwas zu tun:
Hier ist eine Idee. Anstatt zuzulassen, dass der Benutzer geben Sie einen beliebigen Ausdruck nur eine variable verwenden, die der Benutzer festlegen kann. Zum Beispiel:
Dann kann der Benutzer tun dies (pseudo-ish-code, da ich nicht sicher bin, was dein Template-API aussieht):
Andere Idee wäre, eine begrenzte Anzahl von Operatoren oder Funktionen, die der Benutzer verwenden könnte. Statt
eval
ing es, Sie zu analysieren. Zum Beispiel:Dann, wenn Sie analysieren und kompilieren Sie die Vorlage (einfügen der Daten in, im Grunde), die man sich für diese speziellen Funktionen und übersetzen Sie Sie in PHP. Dies ist im Grunde ein whitelisting, da Sie nur damit die Benutzer führen eine sehr eingeschränkte Teilmenge der Funktionalität.
Sollten Sie schauen,Schnurrbart, welche Art von folgt die erste Idee. Die Umsetzung ist eigentlich ziemlich einfach. Die PHP-Implementierung der Schnurrbart ist hier: mustache.php. Man konnte sich durch die Proben und einige code, um zu sehen, wenn Sie könnten einige Ideen.
Einer Sache im Auge zu behalten ist, dass, wenn Sie
eval
ing, die templating-engine ist nicht so benutzerfreundlich, da der Benutzer dann schreiben muss gültigen PHP in Ihren Bedingungen. Ein Teil der Attraktivität der Schnurrbart ist, dass es so einfach und unglaublich einfach zu bedienen. Ich bin ein erfahrener PHP-Entwickler, und während ich hack in PHP den ganzen Tag lang, ich immer noch lieber Schnurrbart für templating, weil es nur lässt mich auf den Punkt kommen.eval()
und die Zeichenfolge ausgeführt wird, stellt dies auch kein größeres Risiko als normalen code. Plus, wenn Sie Umgang mit JSON viel, wahrscheinlich haben Sie es verwendet. Vor der native browser-Unterstützung, die ist noch sehr neueval()
schon immer die fallback-Methode, um die Daten in den browser ein.eval
in den ersten Platz. Ich sehe nicht, wie downvoting meine Antwort, die widmet die meisten seinen text darauf hindeutet, Möglichkeiten, Sie zu vermeideneval
hilft niemandem. Sie können nicht beseitigen, schlechte Programmierung, indem er vorgibt es nicht existiert.Einfach ...
Dinge in
eval('
...')
muss selbst abgeschlossen expression oder Anweisung und '}
' nicht.