Python eval()

pythonserver side programmingprogramming更新于 2025/10/19 10:52:17

eval() 方法解析传递给此方法的表达式并在程序中运行该表达式。换句话说,它将字符串解释为 Python 程序中的代码。

语法

eval 的语法如下 −

eval(expression, globals=None, locals=None)

其中

  • 表达式 − 它是传递给方法的 Python 表达式。

  • globals − 可用的全局方法和变量的字典。

  • locals −可用本地方法和变量的字典。

在下面的例子中,我们允许用户创建一个表达式并运行一个 python 程序来评估该表达式。因此它有助于创建动态代码。

示例

# 要评估的表达式
user_expr = raw_input("输入变量 a 的表达式):")
#输入变量的值
a = int(raw_input("输入 a 的值:"))
# 评估表达式
result = eval(user_expr)
# 打印评估结果
print("Result = {}".format(result))

输出

运行上述代码得到以下结果 −

输入变量 a 的表达式):a*(a-3)+a^2
输入 a 的值:7
Result = 33

安全问题eval()

对于涉及 Web 应用程序或桌面程序的程序,使用此类 eval() 方法可能会造成安全漏洞,因为运行程序的用户可能会提供表达式,这些表达式是系统命令,用于删除文件或从系统中获取敏感数据。为了防止这种情况发生,我们可以将 eval() 函数限制为某些选定的函数或变量。

防止这些漏洞的步骤如下 −

在 eval() 方法中省略局部变量和全局变量。

这样,它将仅在当前范围内进行评估,而不会在此范围之外找到其他变量。

仅省略局部参数

省略局部变量后,所有变量都被视为全局变量。接下来,我们传递一个空字典作为全局变量,这样即使我们将其他库导入到程序中,也只允许内置变量可用。

示例

from time import *
print(eval('dir()', {}))

运行上述代码得到以下结果 −

['__builtins__']

接下来,我们还可以只允许程序使用导入库中的某些方法。

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

输出

运行上述代码得到以下结果 −

['Localtime', '__builtins__', 'sleeptime']

将选择性函数传递给全局和本地

我们还可以通过不允许任何内置函数和仅允许本地导入库中的少数函数来限制本地和全局范围内函数的可用性。在下面的例子中,我们只提供了 time 库中的 gmtime 方法。

示例

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

输出

运行上述代码得到以下结果 −

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)

相关文章


有用资源