前言
如果大家想要在python中将字符串转换成列表,数字,字典等操作,都会想到使用eval()
,确实这个函数很好用,但是它却存在一定的安全性
eval的漏洞
如果用户使用如下的代码
open(r'D://filename.txt', 'r').read()
__import__('os').system('dir')
__import__('os').system('rm -rf /etc/*')
eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件…..如果是格盘等更严重的操作,她也会照做不误!
更详细的情况可以参考这里
如何避免这个漏洞
可以使用ast.literal_eval
,这个函数具有同样的eval()
的功能,但是会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
stackoverflow中的解释
参考
https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
https://blog.csdn.net/Jerry_1126/article/details/68831254
https://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval