Sicherheit von Python eval() auf nicht vertrauenswürdigen strings?

Wenn ich die Bewertung ein Python-string mit eval(), und eine Klasse haben wie:

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

Was sind die Sicherheitsrisiken, wenn ich kein Vertrauen in die Schnur? Insbesondere:

  1. Ist eval(string, {"f": Foo()}, {}) unsicher? Das ist, können Sie erreichen, os oder sys oder etwas unsicher von einem Foo-Instanz?
  2. Ist eval(string, {}, {}) unsicher? Das ist, kann ich erreichen, os oder sys völlig aus gelieferten wie len und Liste?
  3. Ist es eine Möglichkeit zu gelieferten überhaupt nicht vorhanden in der eval-Kontext?

Gibt es einige unsichere Zeichenfolgen wie "[0] * 100000000" ich nicht kümmern, denn im schlimmsten Fall Sie verlangsamen/stoppen Sie das Programm. Ich bin vor allem besorgt über den Schutz von Nutzer-Daten extern auf dem Programm.

Offensichtlich eval(string) ohne eigene Wörterbücher ist unsicher, in den meisten Fällen.

  • ja, wenn es import sys sys.dostuff in die Zeichenfolge, die Sie tun eval auf und dem Sie nicht Vertrauen die Saiten Zeug bekommen kann, echt hässlich.
  • eval hat die nette Eigenschaft, die es erlaubt nur Ausdrücke. So Sachen wie =, importieren und drucken sind nicht erlaubt.
  • Versuchen eval('__import__("sys").stdout.write("Hello Joe")')
InformationsquelleAutor | 2009-03-19
Schreibe einen Kommentar