エンドユーザーは、返されたクエリが警告または警告(独自のしきい値に基づいて)をもたらすかどうかを評価するためのカスタムルールを持つことができるアプリケーションを構築することが任されています。Pythonでexec()を安全に使う方法は?
私はユーザーがロジックをテンプレート化する方法を作りました。
if (abs(<<21>>) >= abs(<<22>>)):
retVal = <<21>>
else:
retVal = <<22>>
<<21>>
と<<22>>
パラメータはプログラムで先に見つかった値に置換されます。例は次のようになります。すべてのこの置換は、変数(execCd
)に保存されている。このように見えること、私は(この例では)非常に単純な場合/ elseブロックを持って発生したら:正しく
if (abs(22.0) >= abs(-162.0)):
retVal = 22.0
else:
retVal = -162.0
これますexec()
。さて、これをどうすれば保護できますか?私はこの記事を見てきました:私はこの例外を有する第二と第三のパラメータを持っているとき
safe_list = ['math','acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
safe_dict['abs'] = abs
exec(execCd,{"__builtins__":None},safe_dict)
しかし、幹部が失敗した - NameError: name 'retVal' is not defined
:http://lybniz2.sourceforge.net/safeeval.html
私のコードは次のように見て終わりますエンドユーザーが持っているカスタムロジックの一部は、かなり頻繁であり、この変更の多くはかなり定期的に行われます。私はカスタムロジックを維持したくないので、エンドユーザはさまざまな警告/アラートのしきい値ロジックを素早くテストできるようにしたいと考えています。
安全でない(故意または意図しない)コードからこのexec文を保護するにはどうすればよいですか?
ERR ... http://stackoverflow.com/questions/3688708/python-safe-sandbox(私は本当に、コピーして正確に貼り付けることができます) – geoffspear