5

スプレッドシートのような計算を実装するための「安全な」eval関数を探しています(numpy / scipyを使用)。

これを行う機能(rexecモジュール)は、明らかに修正不可能なセキュリティ問題のため、2.3以降Pythonから削除されました。これを行うことを目的としたサードパーティのハッキングがいくつかあります。私が見つけた最も考え抜かれた解決策は 、このPythonCookbokレシピ「safe_eval」です。

悪意のあるコードから保護するためにこれ(または同様のもの)を使用する場合、私は合理的に安全ですか、それとも自分のパーサーを書くことに固執していますか?誰かがより良い代替案を知っていますか?

編集:Zopeの一部であるRestrictedPythonを発見しました。これについてのご意見は大歓迎です。

4

6 に答える 6

3

私が推測する安全の定義に依存します。セキュリティの多くは、何を渡すか、およびコンテキストで何を渡すことが許可されているかに依存します。たとえば、ファイルが渡された場合、任意のファイルを開くことができます。

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

さらに、環境は非常に制限されているため (モジュールを渡すことはできません)、re や random などのユーティリティ関数のモジュールを単純に渡すことはできません。

一方、独自のパーサーを作成する必要はありません。Python ast の独自のエバリュエーターを作成するだけで済みます。

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

そうすれば、うまくいけば、安全なインポートを実装できます。もう 1 つのアイデアは、Jython または IronPython を使用して、Java/.Net サンドボックス機能を利用することです。

于 2008-08-28T11:35:19.353 に答える
2

Pythonでデータ構造を書き留めて読み取るだけで、カスタムコードを実行する実際の容量が必要ない場合は、次の方が適しています:http: //code.activestate.com/recipes/364469-safe -eval /

コードが実行されず、静的データ構造(文字列、リスト、タプル、辞書)のみが評価されることを保証します。

于 2011-08-02T09:19:57.147 に答える
2

独自のパーサーを作成するのは楽しいかもしれません! 人々は、数式を入力するときに Python ではなく、使い慣れたスプレッドシート構文 (Excel など) を使用することを期待しているため、より良いオプションかもしれません。私は safe_eval に精通していませんが、このようなものには確かに悪用される可能性があると思います。

于 2008-08-26T15:44:31.190 に答える
1

そのコードは非常に安全に見えますが、私は常に、十分にやる気のある人なら、十分な時間があればコードを破ることができると考えてきました。それを乗り越えるにはかなりの決意が必要だと思いますが、それができると比較的確信しています。

于 2008-08-27T02:37:05.973 に答える
0

必要な機能はコンパイラ言語サービスにあります 。http://docs.python.org/library/language.htmlを参照 してください。式のみを受け入れるようにアプリを定義する場合、入力を式としてコンパイルし、次の場合に例外を取得できます。たとえば、セミコロンやステートメント形式がある場合はそうではありません。

于 2012-01-06T22:41:54.357 に答える
0

Daniel さん、 Jinjaはあなたにとって役に立つかもしれないし、役に立たないかもしれないサンドボックス環境を実装しています。私が覚えていることから、それはまだリスト内包表記を「理解」していません。

サンボックス情報

于 2008-08-28T10:12:03.873 に答える