Die meisten modernen Sprachen (die irgendwie interpretiert werden) haben eine Art Bewertungsfunktion . Eine solche Funktion führt einen beliebigen Sprachcode aus, der die meiste Zeit als Hauptargument als Zeichenfolge übergeben wurde (verschiedene Sprachen können der eval-Funktion weitere Funktionen hinzufügen).
Ich verstehe Benutzer sollten nicht ausgeführt werden dürfen (diese Funktion bearbeiten nehmen also direkt oder indirekt beliebige Eingabe von einem beliebigen Benutzer zu übergeben eval
), vor allem mit serverseitigen Software, da sie den Prozess bösartigen Code auszuführen zwingen könnte. Auf diese Weise empfehlen uns Tutorials und Communities, eval nicht zu verwenden. Es gibt jedoch viele Male, in denen eval nützlich ist und verwendet wird:
- Benutzerdefinierte Zugriffsregeln für Softwareelemente (IIRC OpenERP verfügt über ein Objekt,
ir.rule
das dynamischen Python-Code verwenden kann). - Benutzerdefinierte Berechnungen und / oder Kriterien (OpenERP verfügt über solche Felder, um benutzerdefinierte Codeberechnungen zu ermöglichen).
- OpenERP-Report-Parser (ja, ich weiß, dass ich Sie mit OpenERP-Dingen ausflippen lasse ... aber es ist das Hauptbeispiel, das ich habe).
- Codierung von Zaubereffekten in einigen RPG-Spielen.
So haben sie eine gute Verwendung, solange sie richtig verwendet werden. Der Hauptvorteil besteht darin, dass Administratoren mit dieser Funktion benutzerdefinierten Code schreiben können, ohne weitere Dateien erstellen und einbinden zu müssen (obwohl die meisten Frameworks, die eval-Funktionen verwenden, auch die Möglichkeit haben, eine Datei, ein Modul, ein Paket usw. anzugeben, aus denen gelesen werden kann).
Eval ist jedoch in der Populärkultur böse. Dinge wie das Einbrechen in Ihr System fallen Ihnen ein.
Es gibt jedoch andere Funktionen, die bei einem Zugriff durch Benutzer schädlich sein können: Aufheben der Verknüpfung, Lesen, Schreiben (Dateisemantik), Speicherzuweisung und Zeigerarithmetik, Datenbankmodellzugriff (auch wenn SQL-injizierbare Fälle nicht berücksichtigt werden).
Im Grunde genommen ist der Code die meiste Zeit, in der ein Code nicht richtig geschrieben oder nicht richtig überwacht wird (Ressourcen, Benutzer, Umgebungen, ...), böse und kann sogar zu wirtschaftlichen Auswirkungen führen.
Aber es gibt etwas Besonderes mit eval
Funktionen (unabhängig von der Sprache).
Frage : Gibt es eine historische Tatsache für diese Angst, Teil der Populärkultur zu werden, anstatt den anderen möglicherweise gefährlichen Merkmalen die gleiche Aufmerksamkeit zu widmen?
eval
, sondern eine interne Funktion hat safe_eval
, die die Umgebung vorbereitet, um zu verhindern, dass der Code gefährliche Dinge tut. Es wurden jedoch Fehler gefunden, da Python eine recht flexible Sprache ist und daher schwer zu kontrollieren ist.