Frage

Ich erwäge einfache mathematische Gleichungen Parsen von von der Quelle zur Laufzeit zu kompilieren. Ich habe gehört, dass es Sicherheitsüberlegungen ist, die mir bewusst vor der Verwendung dieses Ansatzes sein sollte, aber ich kann keine Informationen über diese finden.

Danke

C # .net 2.0, WinForms

War es hilfreich?

Lösung

Wenn die C # „Gleichungen“ gespeichert und ausgetauscht werden können zwischen Benutzern, dann gibt es sicherlich ein Sicherheitsrisiko. Ein Benutzer könnte bösartigen Code in der Gleichung gegeben und hat es auf den Maschinen anderer Nutzer schlechte Dinge zu tun. Oder ein Benutzer einfach in der Eingabe eine bösartige „Gleichung“ dazu verleitet werden könnte (man denke an dem alten alt + F4 Streich hier).

Zum Glück können Sie Host sicher nicht vertrauenswürdigen Code in einem .NET Sandkasten. Die allgemeine Idee ist, dass Sie einen separaten AppDomain (mit dem AppDomain.CreateDomain Methode), die nur minimale Berechtigungen hat, und dann laden und den Benutzercode dort ausführen.

Laden dynamisch Baugruppen in einen separaten AppDomain erzeugt ist eine gute Idee, wie auch immer, weil es Ihnen erlaubt, entladen sie wieder.

Andere Tipps

Das Problem bei diesem Ansatz ist, dass ein Benutzer eingeben könnte jeder Code, den sie wollte (es sei denn, Sie sanieren es). Sie konnten in Code setzen, um alle Ihre Dateien zu löschen. Wenn dies auf einem Server ausgeführt wird, nicht tun. Auch selbst auf einem Desktop, einen Compiler läuft gerade eine Gleichung zu bewerten ist sehr langsam. Machen Sie eine Grammatik für Ihre Gleichungen mit einem Tool wie ANTLR und bettet den Parser in Ihrem Programm.

Vor einiger Zeit stieß ich auf eine kluge Art und Weise, dies zu tun: nutzen Sie die eval Funktion von JScript. Sie können eine einfache JScript-Klasse erstellen:

  class JsMath
  {
    static function Eval(MathExpression : String) : double
    {
      return eval(MathExpression);
    };
  }

Kompilieren es wie folgt aus:

  

jsc / target: library JsMath.js

Jetzt können Sie die jsmath Bibliothek verweisen gerade und die JsMath.Eval Methode verwenden.

Compilieren ist eine relativ sichere Bedienung. Es scheint, als wäre es nur ein Problem sein, wenn es ein ausnutzbaren Puffer im Compiler überrannt wird. den resultierenden Code laufen zu lassen ist sicherlich wenn ein Sicherheitsrisiko. Es sei denn, Sie sind vorsichtig, um die Eingabe sanieren Sie ein ziemlich großes Sicherheitsloch in einer Server-Anwendung eröffnet werden können.

Ich bin neugierig, warum Sie diesen Ansatz einnehmen. Einfache mathematische Gleichungen haben eine ziemlich strenge Grammatik und sind sehr einfach zu analysieren. Ich bin sicher, es gibt ein paar freie Bibliotheken verfügbar und wenn nicht Ihr eigenes Schreiben ist nicht ein sehr großes Unternehmen. Dies würde wahrscheinlich viel schneller als Beschuss aus zu einem Compiler sein, um einen mathematischen Ausdruck Syntax zu validieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top