eval()函数及其安全性问题
1.主要用途
a. 类型转换:字符串转为列表、字典、元组
b. 做计算器使用
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))
'''
a = 1
g = {'a': 20}
print(eval("a+1", g))
x = 1
y = 1
num1 = eval("x+y")
print(num1)
2.参数
eval(sources, globals=None, locals=None)
--- 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。
globals和locals参数是可选的,
(1)如果提供了globals参数,那么它必须是dictionary类型;
(2)如果提供了locals参数,那么它可以是任意的map对象。
⚠️:locals()对象的值不能修改,globals()对象的值可以修改
def func_g():
x = 2
y = 2
num3 = eval("x+y")
print(num3)
num2 = eval("x+y", locals())
print(num2)
func_g()
print(locals()["x"])
print(locals()["y"])
print(globals()["x"])
print(globals()["y"])
z = 0
def func_f():
z = 1
print(locals())
locals()["z"] = 2
print(locals())
func_f()
globals()["z"] = 2
print(z)
3.安全性问题及解决方式
3.eval有安全性问题,比如用户恶意输入就会获得当前目录文件
显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作
4.怎么避免安全问题?
(1)自行写检查函数;
(2)使用ast.literal_eval