eval函数的危险性以及如何设置白名单进行规避风险,但是白名单设置复杂,相关内容参考
其他方式如何规避:
一般情况,可以使用ast.literal_eval()函数是可以代替eval()。但是ast.literal_eval()在将字符串转成函数进行调用时,很可能会报错。可以使用
声明:以下纯属个人观点,欢迎指正
这时还是要用eval(),但用户可能在eval中输入以下
eval("open(r'D://filename.txt', 'r').read()") # 读取文件
eval("__import__('os').system('dir')") # 获取文件目录
eval("__import__('os').system('rm -rf /etc/*')") # 当/etc不存在时就会直接执行/*,有多恐怖自己想
所以简单的方法是eval()内的输入不能让用户进行选择,我们可以将用户输入进行一定程度的拼接,从而规避此类风险,例如:
Pj_id = '00000001' # 项目号,由用户输入
code = '01' # 编码,可以由用户输入
Sys = 'sys01' # 系统编码 可以由用户输入
num = 10 # 一个输入数字
time = 50 # 秒
eval("c" + code+ "_" + Sys+ ".P9('{i}',{j}, {n})".format(i=Pj_id, j=num,n=time))
这里会调用 c01_sys01这个python文件下的P9函数,并且传入了Pj_id ,num,time三个参数,注意它们都在一个字符串内,这样遭遇恶意输入时,程序会直接报错,也不会执行,因为它无法构成一个可执行的函数.
总结:切记不能让用户直接输入eval()内的所有内容,将用户输入进行一定程度的拼接可以打乱原本的输入,起到规避程序执行恶意输入的作用