私は、返されたクエリが警告またはアラートになるかどうかを評価するためのカスタム ルールをエンド ユーザーが持つことができるアプリケーションの構築を任されています (独自のしきい値に基づいて)。
ユーザーがロジックをテンプレート化する方法を構築しました。例は次のようになります。
if (abs(<<21>>) >= abs(<<22>>)):
retVal = <<21>>
else:
retVal = <<22>>
およびパラメータは<<21>>
、<<22>>
プログラムで以前に見つかった値に置き換えられます。execCd
この置換がすべて行われると、変数 ( )に次のように格納された非常に単純な if/else ブロック (この例では) が作成されます。
if (abs(22.0) >= abs(-162.0)):
retVal = 22.0
else:
retVal = -162.0
これはexec()
正しくなります。さて、これをどう確保するか。私はこの記事を見てきました: http://lybniz2.sourceforge.net/safeeval.html
私のコードは次のようになります。
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)
ただし、この例外で2番目と3番目のパラメーターがある場合、execは失敗します-NameError: name 'retVal' is not defined
エンド ユーザーが持つカスタム ロジックの一部は広範であり、その多くはかなり定期的に変更されます。私はカスタム ロジックを維持したくありません。エンド ユーザーは、さまざまな警告/アラートのしきい値ロジックをすばやくテストできるようにしたいと考えています。
安全でない (意図的または意図的でない) コードからこの exec ステートメントを保護するにはどうすればよいですか?