安全にPythonのeval()が信頼できない文字列?
質問
ていただく場合に評価するPython文字列を使用eval()のクラスのように:
class Foo(object):
a = 3
def bar(self, x): return x + a
どのセキュリティ上のリスクが私を信頼していない文字列?特に次の点が重要です。
- は
eval(string, {"f": Foo()}, {})
安全でない?ることができosやsysうに、安全でないからFooインスタンス? - は
eval(string, {}, {})
安全でない?ることができまreach osやsysから完全にbuiltinsのようにlenとです。 - があるので、いくbuiltinsしていないすべてのエバール。
があり、安全でない文字列のように"[0]*100000000"どうでもいいんで最悪のも遅いのです。私は、主に当該保護に関してユーザーデータを外部のプログラム。
明らかに eval(string)
なカスタム辞書には安全でないことが多いです。
解決
あなたは、このようなブラックリストのアプローチでevalを確保することができません。へのアクセスを与える、評価は実際にはCPythonインタプリタをセグメンテーションフォールトます入力の例については、危険なのです参照してください。その上の任意のあなたが好きなクラス、及びます。
他のヒント
eval()
する悪意のあるデータの妥協の世帯全体のシステムを殺猫の食べ愛犬や愛妻がいる。
また最近ではスレッドについこのようなことがいえるでしょうが安全にpython-devリスト、結果:
- のは、本当に難しいんでいます。
- が必要なのでパッチへのpythonインタプリタへのブロックのクします。
- ついていない限りいたしました。
ここから始についての挑戦: http://tav.espians.com/a-challenge-to-break-python-security.html
どのような状況を使用したいと思いますかeval()。またユーザーを実行することができるようにな任意の表現は?きたいというデータ転送ますか?もしかでロックを下に入力しています。
あなたは組み込み関数を使用してos
するために得ることができます。__import__('os')
Python用2.6+、 ASTモジュールを助けることができます。特にast.literal_eval
で、それはあなたがevalにしたい正確に何にも依存するが。
あなたは)(空の辞書をevalに渡す場合でも、それはいくつかの構文のトリックと(C)のPythonをセグメンテーションフォールトすることは可能だということに注意してください。たとえば、あなたのインタプリタでこれを試してください:eval("()"*8**5)
おそらくより良いオフの問題の周り:
- どのような表現また<エバール>?
- きを保証するだけの文字列マッチングの一部は狭義の構文はeval()はいくらですか?
- した場合 その ることはありません。
例えば、たいというを行う事によって、ユーザの入力代数表現を評価し、それを考慮に制限してください一文字の変数名、数字、特定の事業者と。んでeval()文字列を含むいただけます。
eval()
の非安全上の非常に良い記事/ <ありA> Pythonののチュートリアルへのマーク・ピルグリムのダイブます。
この記事から引用:
最後に、それは安全にすることが可能です 信頼されていないPythonの式を評価、 その「安全」のいくつかの定義については、 でひどく有用であることが判明していません 実生活。あなただけならそれは素晴らしいです 遊んで、あなたならばそれがいいのよ 唯一今までそれが入力を信頼できる渡します。しかし 何か他のものはちょうどを求めています トラブルます。