文章内容

2023/10/4 18:10:52,作 者: 黄兵

Python eval() 与 ast.literal_eval() 区别

最近需要将一个字符串的值变成列表,字符串的值如下:

'[1,2,4,5]'

我们可以使用如下方式,将字符串值变成 list 值:

eval('[1,2,4,5]')

当然上面是一个简单的例子,在实际项目中不可能如此简单。

使用 eval() 也存在安全隐患,下面是一个示例:

下面的代码具有一定危险性,请注意:

eval("os.system(‘rm -rf /’)")

这将会删除计算机上的所有文件,所以轻易不要运行上面的代码。

使用 eval() 函数需要谨慎,因为它执行传递给它的任何表达式,这可能导致安全性问题,特别是当从不受信任的源获取输入时。在这种情况下,因为你是自己输入字符串,且字符串是硬编码在代码中的,风险较小。但是,要注意在其他情况下避免直接使用 eval()

在实际开发中,更安全的方法可能是使用其他解析方法,如使用 ast.literal_eval() 函数。

我们可以使用更安全的方式,ast.literal_eval() 仅认为 Python 语法的一小部分是有效的:

提供的字符串或节点只能包含以下 Python 文字结构:字符串、字节、数字、元组、列表、字典、集合、布尔值和 None

总结:

eval: 这非常强大,但如果您接受来自不受信任的输入的字符串进行评估,这也是非常危险的。假设正在评估的字符串是“os.system('rm -rf /')” 它实际上会开始删除计算机上的所有文件。

ast.literal_eval: 安全地评估表达式节点或包含 Python 文字或容器显示的字符串。提供的字符串或节点只能包含以下 Python 文字结构:字符串、字节、数字、元组、列表、字典、集合、布尔值、None、字节和集合。


参考资料:

1、Using python's eval() vs. ast.literal_eval()

2、Eval really is dangerous


其它相关推荐:

1、 在Python中使用Mysql数据库连接池

2、Python """ '''注释的区别

3、Python logging

4、MySQLdb 单引号导致执行SQL出现错误

5、python的取整函数:向上取整,向下取整,四舍五入取整

分享到:

发表评论

评论列表