我正在编写一个程序,用户需要能够使用自写的数学函数,其中包含来自 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)
那安全吗?我知道这不好。
请帮忙。