import os
from ast import literal_eval
test_a = '{"name":1}'
print(eval(test_a), type(eval(test_a)))
print(literal_eval(test_a), type(literal_eval(test_a)))
try:
test_a = "__import__('os').remove('1.txt')"
print(eval(test_a))
print(os.path.exists('1.txt'))
except Exception as e:
print("eval", ValueError(e))
try:
test_a = "__import__('os').remove('2.txt')"
print(literal_eval(test_a))
print(os.path.exists('2.txt'))
except Exception as e:
print("literal_eval", ValueError(e))
执行前
执行后
控制台输出
eval()
简单来说就是回去指定任意类型的命令。无论是转换类型 还是 python 语句.
ast.literal_eval
https://peps.python.org/pep-0518/ 这是介绍地址.
https://docs.python.org/3/library/ast.html#ast.literal_eval literal_eval部分说明
https://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval 有讨论组
其中还是建议升级高版本的python.
总结
ast. literal_eval 并没有说明是绝对安全的,只是申明了更安全一些,所以在使用过程中还是需要进行注意.
|