Python:使用 sympy.sympify 对数学函数执行安全 eval()

标签 python parsing eval sympy

我正在编写一个程序,用户需要能够使用自己编写的数学函数,其中包含来自 numpy 和 scipy 的函数,例如。 scipy.special.wofz()

这些函数将存储在文件中并由程序作为字符串导入。我环顾四周,发现 eval()exec() 不是一种安全的方法。 例如。 here .

安全问题是好用户从可以访问好用户系统的恶意用户加载文件。

我正在考虑做这样的事情:

#!/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)

这样安全吗?我知道这不好。

请帮忙。

最佳答案

使用 sympy,这是一种更安全的选择。

import sympy
from sympy.core.function import Function
from sympy.core import S
from sympy import sympify
from sympy.functions import im
from scipy.special import wofz

class Wofz(Function):
    is_real = True
    @classmethod
    def _should_evalf(csl,arg):
        return True
    def as_base_exp(cls):
        return cls,S.One

    def _eval_evalf(cls, prec):
        return sympy.numbers.Number(im(wofz(float(cls.args[0]))))

print sympify("Wofz(2)",{'Wofz':Wofz}).evalf()

输出(你必须以某种方式处理虚部):

0.340026217066065

关于Python:使用 sympy.sympify 对数学函数执行安全 eval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076300/

相关文章:

python - Django本地异步任务

python - 将值的StandardScaler()作为新列添加到DataFrame会部分返回NaN

R 在导入时将字符附加到 CSV 文件

解析GF(2)中的代数表达式

javascript - 检索 JSON 变量的值

python - 在 Python Matplotlib 中绘制箱线图和须线图时出现意外的关键字参数 'label'

python - 质因数,帮助理解平方根的用途

Python,需要帮助将文本文件中的项目解析为列表

asynchronous - hiredis 从异步上下文运行同步命令

bash - bash 中的间接变量赋值