Python eval() 函数 理解和应用

Eval() 方程

Table of Contents

Eval() 方程

概括:

定义:

例子:

安全漏洞:

 应对漏洞

方程的运用


概括:

这是一个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 加以运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值