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:
- Ist
eval(string, {"f": Foo()}, {})
unsicher? Das ist, können Sie erreichen, os oder sys oder etwas unsicher von einem Foo-Instanz? - Ist
eval(string, {}, {})
unsicher? Das ist, kann ich erreichen, os oder sys völlig aus gelieferten wie len und Liste? - 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")')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht sicher eval mit einem blacklist-Ansatz. Sehen Eval ist wirklich gefährlich Beispiele für die Eingabe, wird segfault den CPython-interpreter, geben Sie Zugriff auf jede Klasse, die Sie mögen, und so weiter.
eval()
wird böswillige Daten, zu gefährden das gesamte system, zu töten, Ihre Katze, Essen Sie Ihren Hund und machen die Liebe zu Ihrer Frau.Gab es vor kurzem einen thread darüber, wie das zu tun diese Art der Sache sicher auf die python-dev-Liste, und die Schlussfolgerungen waren:
Starten hier Lesen Sie über die Herausforderung: http://tav.espians.com/a-challenge-to-break-python-security.html
Welche situation möchten Sie mit eval() in? Sind Sie wollen ein Benutzer in der Lage sein, beliebige Ausdrücke? Oder sind Sie wollen, um Daten zu übertragen, die in irgendeiner Weise? Vielleicht ist es möglich, zum sperren der Eingabe in irgendeiner Weise.
Können Sie bekommen zu
os
Verwendung von builtin-Funktionen:__import__('os')
.Für python 2.6+, die ast Modul helfen kann; insbesondere
ast.literal_eval
, obwohl es genau hängt davon ab, was Sie wollen, eval.Beachten Sie, dass selbst wenn Sie leer Wörterbücher zu eval(), es ist immer noch möglich, segfault (C)Python mit einigen syntax-tricks. Zum Beispiel, versuchen Sie dies auf Ihre Dolmetscher:
eval("()"*8**5)
Sind Sie wahrscheinlich besser dran, Dreh die Frage um:
Zum Beispiel, wenn Sie wollen, lassen Sie die Benutzer geben Sie einen algebraischen Ausdruck für die Bewertung, betrachten und beschränkt Sie auf einen Buchstaben Variablennamen, zahlen, und einen bestimmten Satz von Operatoren und Funktionen. Nicht eval () - strings mit etwas anderes.
Gibt es eine sehr gute Artikel über die un-Sicherheit
eval()
in Mark Pilgrim Dive into Python tutorial.Zitiert aus diesem Artikel: