Frage

Ich suche nach einer „sicheren“ Auswertungsfunktion, um tabellenkalkulationsähnliche Berechnungen zu implementieren (mit Numpy/Scipy).

Die Funktionalität hierfür (die rexec-Modul) wurde seit 2.3 aufgrund scheinbar nicht behebbarer Sicherheitsprobleme aus Python entfernt.Es gibt mehrere Hacks von Drittanbietern, die dies vorgeben – die durchdachteste Lösung, die ich gefunden habe, istdieses Python Cookbok-Rezept, „safe_eval“.

Bin ich einigermaßen sicher, wenn ich dies (oder etwas Ähnliches) verwende, um mich vor bösartigem Code zu schützen, oder muss ich meinen eigenen Parser schreiben?Kennt jemand bessere Alternativen?

BEARBEITEN:Ich habe es gerade entdeckt RestrictedPython, das Teil von Zope ist.Alle Meinungen hierzu sind willkommen.

War es hilfreich?

Lösung

Hängt wohl von Ihrer Definition von „sicher“ ab.Ein Großteil der Sicherheit hängt davon ab, was Sie übergeben und was Sie im Kontext weitergeben dürfen.Wenn beispielsweise eine Datei übergeben wird, kann ich beliebige Dateien öffnen:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

Darüber hinaus ist die Umgebung sehr eingeschränkt (Sie können keine Module übergeben), sodass Sie nicht einfach ein Modul mit Hilfsfunktionen wie re oder random übergeben können.

Andererseits müssen Sie keinen eigenen Parser schreiben, sondern können einfach Ihren eigenen Evaluator für den Python-Ast schreiben:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

Auf diese Weise könnten Sie hoffentlich sichere Importe implementieren.Die andere Idee besteht darin, Jython oder IronPython zu verwenden und die Sandboxing-Funktionen von Java/.Net zu nutzen.

Andere Tipps

Es könnte Spaß machen, einen eigenen Parser zu schreiben!Dies ist möglicherweise die bessere Option, da bei der Eingabe von Formeln erwartet wird, dass die vertraute Tabellenkalkulationssyntax (Excel usw.) und nicht Python verwendet wird.Ich kenne mich mit „safe_eval“ nicht aus, aber ich kann mir vorstellen, dass so etwas durchaus das Potenzial für Ausnutzung birgt.

Obwohl dieser Code ziemlich sicher aussieht, war ich immer der Meinung, dass jede ausreichend motivierte Person ihn knacken könnte, wenn er genügend Zeit hätte.Ich denke zwar, dass es einiger Entschlossenheit bedarf, das durchzustehen, aber ich bin relativ sicher, dass es gelingen könnte.

Wenn Sie lediglich eine Datenstruktur in Python aufschreiben und lesen müssen und nicht die tatsächliche Kapazität zum Ausführen von benutzerdefiniertem Code benötigen, ist dies die bessere Lösung:http://code.activestate.com/recipes/364469-safe-eval/

Es stellt sicher, dass kein Code ausgeführt wird, sondern nur statische Datenstrukturen ausgewertet werden:Zeichenfolgen, Listen, Tupel, Wörterbücher.

Daniel,Jinja implementiert eine Sandbox-Umgebung, die für Sie nützlich sein kann oder auch nicht.Soweit ich mich erinnere, werden Listenverständnisse noch nicht „verstanden“.

Sanbox-Info

Die gewünschte Funktionalität finden Sie in den Compiler-Sprachdiensten, siehehttp://docs.python.org/library/sprache.htmlWenn Sie Ihre App so definieren, dass sie nur Ausdrücke akzeptiert, können Sie die Eingabe als Ausdruck kompilieren und eine Ausnahme erhalten, wenn dies nicht der Fall ist, z. B.wenn Semikolons oder Anweisungsformen vorhanden sind.

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