質問

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

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

悪意のあるコードから保護するためにこれ (または類似のもの) を使用した場合、かなり安全なのでしょうか? それとも、独自のパーサーを作成することに固執しているのでしょうか?誰かがより良い代替案を知っていますか?

編集:たった今発見しました 制限付きPython, 、これは Zope の一部です。これに関するご意見は大歓迎です。

役に立ちましたか?

解決

安全の定義にもよると思います。セキュリティの多くは、何を渡すか、コンテキスト内で何を渡すことが許可されるかによって決まります。たとえば、ファイルが渡された場合、任意のファイルを開くことができます。

>>> 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 サンドボックス機能を活用することです。

他のヒント

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

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

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

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

ダニエル、神社 サンドボックス環境を実装しますが、役に立つ場合もあればそうでない場合もあります。私の記憶によれば、それはまだリストの内包表記を「理解」していません。

サンボックス情報

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top