Frage

Wenn ich einen Python-String mit eval bin Auswertung () und hat eine Klasse wie:

class Foo(object):
    a = 3
    def bar(self, x): return x + a

Was sind die Sicherheitsrisiken, wenn ich die Zeichenfolge nicht vertrauen? Insbesondere gilt Folgendes:

  1. Ist eval(string, {"f": Foo()}, {}) unsicher? Das heißt, können Sie erreichen os oder sys oder etwas unsicher von einer Foo Instanz?
  2. Ist eval(string, {}, {}) unsicher? Das heißt, kann ich erreichen os oder sys vollständig aus builtins wie len und Liste?
  3. Gibt es eine Möglichkeit builtins nicht vorhanden überhaupt im eval Kontext zu machen?

Es gibt einige unsicheren Zeichenkette wie „[0] * 100000000“ Ich kümmere mich nicht um, denn im schlimmsten Fall sie langsam / das Programm stoppen. Ich bin in erster Linie um Benutzerdaten außerhalb des Programms zu schützen.

Offensichtlich eval(string) ohne benutzerdefinierte Wörterbuch ist unsicher in den meisten Fällen.

War es hilfreich?

Lösung

Sie können nicht eval sicher mit einem schwarzen Liste Ansatz wie diese. Siehe Eval wirklich gefährlich Beispiele für Eingabe, die den CPython Interpreter segfault wird, den Zugang zu jede Klasse, die Sie mögen, und so weiter.

Andere Tipps

eval() wird schädliche Daten erlauben Ihr gesamtes System zu gefährden, töten Sie Ihre Katze, essen Sie Ihren Hund und machen Liebe zu deiner Frau.

Es gibt vor kurzem ein Thread darüber, wie diese Art der Sache auf der Python-dev Liste sicher zu tun, und die Schlussfolgerungen waren:

  • Es ist wirklich schwer, dies richtig zu machen.
  • Es erfordert Patches auf die Python-Interpreter viele Klassen von Angriffen zu blockieren.
  • Sie es nicht tun, wenn Sie wirklich wollen.

Hier starten um die Herausforderung zu lesen: http: // tav.espians.com/a-challenge-to-break-python-security.html

Welche Situation möchten Sie in eval () benutzen? Wollen Sie, um einen Benutzer zu können, beliebige Ausdrücke auszuführen? Oder wollen Sie Daten in irgendeiner Art und Weise übertragen? Vielleicht ist es möglich, die Eingabe in irgendeiner Weise zu sperren.

Sie können erhalten os gebautet Funktionen:. __import__('os')

Für Python 2.6+, das ast Modul kann helfen; insbesondere ast.literal_eval, obwohl es genau das hängt davon ab, was Sie wollen, eval.

Hinweis

, dass selbst wenn Sie leer Wörterbücher passieren eval (), ist es immer noch möglich ist, segfault (C) Python mit einigen Syntax Tricks. Zum Beispiel, versuchen Sie diese auf Ihrem Dolmetscher: eval("()"*8**5)

Sie sind wahrscheinlich besser dran, die Frage umzudrehen:

  1. Welche Art von Ausdrücken sind Sie wollen eval?
  2. Können Sie sicherstellen, dass nur Strings eine eng definierte Syntax sind eval () d passend?
  3. Dann betrachten, wenn , die ist sicher.

Zum Beispiel, wenn Sie wollen, die der Benutzer eingeben einen algebraischen Ausdruck für die Bewertung lassen, sollten sie einen Buchstaben Variablennamen, Zahlen und einen bestimmten Satz von Operatoren und Funktionen zu beschränken. Nicht eval (Strings) etwas anderes enthält.

Es ist ein sehr guter Artikel über die un-Sicherheit von eval() rel="nofollow in Mark Pilgrim Tauchen Sie ein in Python Tutorial.

von diesem Artikel Zitat:

  

Am Ende ist es möglich, sicher   auswerten nicht vertrauenswürdigen Python-Ausdrücke,   für einige Definition von „sicher“, dass   stellt sich heraus, nicht sehr nützlich zu sein, in   wahres Leben. Es ist in Ordnung, wenn Sie sind nur   Herumspielen, und es ist, wenn Sie in Ordnung   immer nur gibt es Eingang vertraut. Aber   Alles andere ist nur gefragt, für   Schwierigkeiten.

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