ユーザーが numpy および scipy の関数を含む自己記述の数学関数を使用できるようにする必要があるプログラムを作成しています。scipy.special.wofz() .
これらの関数はファイルに保存され、プログラムによって文字列としてインポートされます。eval()またはexec()は安全な方法ではないことがわかりました。例えば。ここに。
セキュリティ上の問題は、善意のユーザーが、善良なユーザーのシステムにアクセスできる悪意のあるユーザーからファイルをロードすることです。
私はこのようなことを考えていました:
#!/bin/python
from scipy.special import *
from numpy import *
import sympy
# Define variable a
vars = {"a":1}
# This is the string I get from a file
string = "wofz(a)"
parsed_string = sympy.sympify(string)
parsed_string.evalf(subs=vars)
ただし、これは機能しません。以下のみを返します。
wofz(a)
wofz(a) は評価されません。これはそのように機能するはずですか?
私には別の考えがありました。つまり、この数学関数が sympify を通過したら、安全であるはずだと考えました。私は単に次のようなことをすることができます:
globals = {wofz:wofz}
eval(str(parsed_string), vars, globals)
これは正常に動作し、次を返します。
(0.36787944117144233+0.60715770584139372j)
それは安全ですか?私はそれが良くないことを知っています。
助けてください。