Thread Ausführen von externem Code. (8 answers)
Opened by topeg at 2007-08-22 22:19

sid burn
 2007-08-23 15:11
#98564 #98564
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
topeg+2007-08-23 11:39:23--
wenn ich mich richtig erinnere wird bei "eval $string" ein neue Interperterinstanz erzeugt. (bei eval{code...} ist das so weit ich mich erinnere nicht der Fall...) Und ich kann mir durchaus vorstellen, daß man dabei den überlagerten main-Namensraum erreichen kann. Aber das sind nur Vermutungen.
Und der Code in deinem Beispiel lässt sich auch anders schreiben...

1) Ja eval{} führt keine neue Instanz aus. Es Funktioniert wie ein try: catch: in anderen Sprachen. Auch Syntaxüberprüfung findet innerhlab eines eval {} blockes statt
2) Klar lässt sich der Code auch anders schreiben, es ging hier eher um das Prinzip das eval sehr wohl nützlich ist. Und es mag spezielle Fälle geben wo man auf eval {} angewiesen ist. Auch wenn die selten sind.
3) Auch ein String eval ist erstmal nicht gefährlich. Man kann damit mit sehr wenig Code neuen Code Intern Generieren und ausführen lassen. Das kann viel Arbeiten sparen. In Bestimmten fällen kannst du damit sogar die Performance erhöhen. Kann dir aber auf der schnelle auch kein Beispiel geben, da ich darin nicht so geübt bin.

Das was du damit verhinderst ist wenn einer String eval nutzt und damit Code ausführt der aus benutzereingaben stammt. Wenn das aber unbedingt jemand machen möchte ist es nicht die Frage ob er nicht sowieso einen weg drumherum findet. Ich würde jedenfalls die Plugin Authoren nicht behindern wollen wenn sie es für gute Zwecke nutzen. Aber das musst du ja Wissen.

Ich hab dir nur Gründe genannt wofür Plugin Authoren eval nutzen könnten, und die reine benutzung von eval ist auch erstmal nicht sofort gefährlich.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Ausführen von externem Code.