2013-05-23 11 views
7

私たちは、Pythonのeval()はStackOverflowの全体に悪SymPyのsympify(<string>).evalf()はどれくらい安全ですか?

http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

スレッドで知ってはSymPyのevalf()を使用することをお勧めします。

Python初心者のため、私はスキルが不足しているので、evalf()は安全だと自分自身では確信できません。誰でもevalf()(何か)を詳しく説明できますか?

+0

「eval」ではなく「evalf」を使用する提案はありません。 'eval'の代わりに' sympify'を使うという提案がありますが、(セキュリティ上の観点から)これらは基本的に同じであると誤っています。 – Krastanov

答えて

7

のpython evalとsympy evalf間で共通のもの(後者はsympy式ツリーの数値を算出するためのものであるとevalは、すべての文字列を解析して、それを評価についてです一方で、それは、構文解析を行うには何もを持っていませんがありませんそれがコードの場合)。

一方、sympifyは実際にはevalを使用しているため、evalと同じように危険です。

ありsympifyが使用されている2つの基本モードがあり、おそらくそれは彼らが同じ機能で混合しまったということは悪い考えです:

  • sympify(some_object)がでの使用に適したオブジェクトの表現を返しますが、 CASは、evalを通してほぼ直接テキストを解析なるsympy.Integer(1)

  • sympify("some_text")int(1)を変換ように(にsympy.parsing本からインポートするための検索しますに従ってください)。いくつかの制約があるので安全ですが、は安全ではありませんです。

+0

あなたの答えをありがとう。第2の基本モード、 'sympify(いくつかのテキスト") 'と、これがどのように悪意を持って悪用されるのかを詳しく教えてください。たとえば、[Ned Batchelderのeval dangerous](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)のサンプルはSymPyで動作しますか? 'f = sympy.sympify( '__ import __(" os ")')'を呼び出すEGは私に呼び出し可能なオブジェクトを与えません。 –

+2

OK、sympifyを使って 'subprocess.Popen'にアクセスし、システムコマンドEG' f = sympy.sympify( "" "[] .__ class __.__ base __.__ subclasses __()[158]( 'ls ') "" ")'私のディレクトリの内容をリストアップしました。そこから 'rm -rf \'への簡単なステップがあります。さて、[@ Krastanov](http://stackoverflow.com/users/669329/krastanov)あなたはsympyが**安全でないことを証明した!シンピーは危険です。 –

関連する問題