【6】基础知识类---eval函数及其安全性问题

eval()函数及其安全性问题

1.主要用途

a. 类型转换:字符串转为列表、字典、元组
  b. 做计算器使用
# 举例1:类型转换:字符串转为列表、字典、元组
mylist = '[1,2,3,4,[5,6,7,8,9]]'
mydict = "{'a':123,'b':456,'c':789}"
mytuple = '([1,3,5],[5,6,7,8,9],[123,456,789])'
'''
print("字符串转为列表", eval(mylist))
print("字符串转为字典", eval(mydict))
print("字符串转为元组", eval(mytuple))
'''
# 举例2
a = 1
g = {'a': 20}
print(eval("a+1", g))  # 21

# 举例3:做计算器使用
x = 1
y = 1
num1 = eval("x+y")
print(num1)  # 2

2.参数

eval(sources, globals=None, locals=None)
    --- 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。
    globalslocals参数是可选的,
        (1)如果提供了globals参数,那么它必须是dictionary类型;
        (2)如果提供了locals参数,那么它可以是任意的map对象。
    ⚠️:locals()对象的值不能修改,globals()对象的值可以修改
def func_g():
    x = 2
    y = 2
    num3 = eval("x+y")
    print(num3)  # 4 默认使用局部命名空间
    # 全局命名空间
    # num2 = eval("x+y", globals())  # 2
    # 局部命名空间
    num2 = eval("x+y", locals())  # 4
    print(num2)


func_g()
print(locals()["x"])  # 1
print(locals()["y"])  # 1
print(globals()["x"])  # 1
print(globals()["y"])  # 1

# locals()对象的值不能修改,globals()对象的值可以修改
z = 0


def func_f():
    z = 1
    print(locals())  # {'z': 1}
    locals()["z"] = 2
    print(locals())  # {'z': 1}


func_f()
globals()["z"] = 2
print(z)  # 2

3.安全性问题及解决方式

3.eval有安全性问题,比如用户恶意输入就会获得当前目录文件
    显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作
4.怎么避免安全问题?
    (1)自行写检查函数;
    (2)使用ast.literal_eval
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值