Eval() 方程
Table of Contents
概括:
这是一个python自带方程
它允许 python 程序运行它自带code
这个程序可以遍历给他的code然后运行他们
—————定义可能复杂难懂 看看例子去理解
定义:
eval(expression, globals=None, locals=None)
expression: 这个是所要运行的python自带code
globals (optional): 一个目录包含这些可能被用到的方程 和变量
locals (optional): 另外一个目录 包含可能被用到的 方程和变量
例子:
首先我们用一个简单的数学例子 去 讲解这个方程
from math import *
def function_creator():
# expression to be evaluated
expr = input("Enter the function(in terms of x):")
# variable used in expression
x = int(raw_input("Enter the value of x:"))
# evaluating expression
y = eval(expr)
# printing evaluated result
print("y = {}".format(y))
if __name__ == "__main__":
function_creator()
我们在这里 创造了一个 function creator
去 接收俩个 input
1. 应用于 x 的方程
2. 是 x
eval 在这里 会帮我们直接用第一个的公式和第二个的x 去运算
结果:
Enter the function(in terms of x):x*(x+1)*(x+2)
Enter the value of x:3
y = 60
可以看出eval 帮我们直接用x去运算第一个的方程 得到 y值
安全漏洞:
eval存在着一些知名的安全漏洞
from math import *
def password():
return '123456'
def function_creator():
# expression to be evaluated
expr = input("Enter the function(in terms of x):")
# variable used in expression
x = int(raw_input("Enter the value of x:"))
# evaluating expression
y = eval(expr)
# printing evaluated result
print("y = {}".format(y))
if __name__ == "__main__":
function_creator()
可以注意到在code中 我们多加了一个方程 password(),
如果在有人尝试运行这个方程,
Enter the function(in terms of x): password()
Enter the value of x:0
结果你的密码就会被 return出来
y = 123456
应对漏洞
from math import *
def password():
return '123456'
def function_creator():
# expression to be evaluated
expr = raw_input("Enter the function(in terms of x):")
# variable used in expression
x = int(raw_input("Enter the value of x:"))
# passing variable x in safe dictionary
safe_dict['x'] = x
# evaluating expression
y = eval(expr, {"__builtins__":None}, safe_dict)
# printing evaluated result
print("y = {}".format(y))
if __name__ == "__main__":
# list of safe methods
safe_list = ['acos', 'asin', 'atan', 'atan2', 'ceil', 'cos',
'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor',
'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10',
'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt',
'tan', 'tanh']
# creating a dictionary of safe methods
safe_dict = dict([(k, locals().get(k, None)) for k in safe_list])
function_creator()
这样就很好的限制 eval()的运行条件 和范围
规定了 eval() 只能检测 safe_list 里的方程去执行运算
============================================================
方程的运用
因为他的安全原因, 它并没有被广泛运用在编程中
现在应用的领域 仅仅像是 一些基础的数学运算
还有的是让用户输入一些他们自己的command 加以运算