首页 > 其他分享 >eval和ast.literal_eval区别

eval和ast.literal_eval区别

时间:2022-12-13 15:11:35浏览次数:38  
标签:convert eval ast literal File line

一、eval函数

eval()官方文档里面给出来的功能解释是:将字符串string对象转化为有效的表达式参与求值运算返回计算结果。

eval(expression[, globals[, locals]])

参数

  • expression -- 表达式。
  • globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

 

运用比较多的功能是以下两种:

1、eval 作为 python 的一个内置函数,用于返回传入的字符串表达式结果。

print(eval('8+10'))
# 18

x=4;y=9
print(eval('x*y'))
# 36

print(eval('2+6==8'))
# True

存在 globals 变量作用域时,取 globals 中变量。

x=2;y=4;z=6
g = {'x':10,'y':20}
print(eval('x*y',g))
# 200

存在 locals 变量作用域时,取 locals 中变量。

x=2;y=4;z=6
g = {'x':10,'y':20}
l = {'y':30,'z':40}
print(eval('x*y',g,l))
# 300

 

2、将字符串转成字典、元祖、列表。

x = "{'a':10,'b':20,'c':30}"
print(eval(x))
# {'a': 10, 'b': 20, 'c': 30}

y = "[5,10,15]"
print(eval(y))
# [5, 10, 15]

z = "(1,2,3)"
print(eval(z))
# (1, 2, 3)

 

虽然 eval 处理字符串的能力很强,但也存在着非常大的安全隐患,因为它具有可以将字符串转成表达式执行的特性,所以它也就可以去执行系统命令。这样很容易被别有用心的人用来执行系统命令,删除关键文件系统,比如用户恶意输入就会获得当前目录文件。 

# 获取系统文件
eval("__import__('os').system('dir')")

 

二、ast.literal_eval 函数

ast 模块的 literal_eval 函数是对 python 内置函数 eval 存在安全隐患的一种安全解决方式。它会判断需要计算的内容是不是合法的Python类型,如果是则执行,否则就报错。例如使用 ast.literal_eaval 处理字符串转换

import ast

x = "{'a':10,'b':20,'c':30}"
print(ast.literal_eval(x))
# {'a': 10, 'b': 20, 'c': 30}

y = "[5,10,15]"
print(ast.literal_eval(y))
# [5, 10, 15]

z = "(1,2,3)"
print(ast.literal_eval(z))
# (1, 2, 3)

 

ast.literal_eval 不能执行上述 eval 函数的计算操作

import ast
ast.literal_eval('2+6')

'''
Traceback (most recent call last):
  File "d:\program files\python37\Lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "d:\program files\python37\Lib\ast.py", line 91, in literal_eval
    return _convert(node_or_string)
  File "d:\program files\python37\Lib\ast.py", line 90, in _convert
    return _convert_signed_num(node)
  File "d:\program files\python37\Lib\ast.py", line 63, in _convert_signed_num
    return _convert_num(node)
  File "d:\program files\python37\Lib\ast.py", line 55, in _convert_num
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.BinOp object at 0x000001AC3D88FB70>
'''

 

当然也不会执行获取、删除文件系统等危险操作:

ast.literal_eval("__import__('os').system('dir')")

'''
Traceback (most recent call last):
  File "d:\program files\python37\Lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 2, in <module>
  File "d:\program files\python37\Lib\ast.py", line 91, in literal_eval
    return _convert(node_or_string)
  File "d:\program files\python37\Lib\ast.py", line 90, in _convert
    return _convert_signed_num(node)
  File "d:\program files\python37\Lib\ast.py", line 63, in _convert_signed_num
    return _convert_num(node)
  File "d:\program files\python37\Lib\ast.py", line 55, in _convert_num
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x000001AC3D89B940>
'''

 

 总结:当处理字符串转换时,虽然 eval 函数可以通过变量作用域限制一些危险操作,但无法完全堵住所有非法操作。所以我们使用安全性更高的 ast.literal_eval 替代 eval 函数。

 

标签:convert,eval,ast,literal,File,line
From: https://www.cnblogs.com/shenh/p/16976837.html

相关文章

  • 【Unity】 HTFramework框架(三十六)AssetsMaster资源管理器,做资产的主人
    更新日期:2020年8月13日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​AssetsMaster​​​​使用AssetsMaster​​​​打开AssetsMaster......
  • golang ast获取注释信息
     packagemainimport( "go/ast" "go/parser" "go/token" "log" "path/filepath")typeVisitorstruct{ fset*token.FileSet}func(v*Visitor)Visit(......
  • ThreadLocal(2) - FastThreadLocal
    FastThreadLocal该类位于netty的util包下,netty的线程都使用的是FastThreadLocal而不是jdk的ThreadLocaljdk的ThreadLocal使用Thread类的ThreadLocalMapnetty的Fas......
  • ElasticSearch原理篇
    一、开篇几个问题 1、大规模数据如何检索?当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑:1)用什么数据库好?(MySQL、sybase、Oracle、达......
  • 【开源系统脚手架】人人快速开发框架 人人VUE(renren-fast-vue)启动教程
     代码​​https://www.renren.io/guide/#project​​​​https://github.com/renrenio/renren-fast-vue​​ 1.nodejs需使用8.0版本2.更改策略,设置权限(管理员打开cmd)......
  • 【安装】Linux安装Elasticsearch教程
    Elastic官网​​开源搜索:Elasticsearch、ELKStack和Kibana的开发者|Elastic​​Elasticsearch(官网:​​https://www.elastic.co/cn/products/elasticsearch​​ )需要......
  • 谷歌浏览器安装elasticsearch-head插件
    之前在使用es的时候有插入索引和数据的需求但是对于es操作不适太熟悉,然后就用docker安装了一个es-head进行操作,但是用docker安装的es-head有时候不是太好用(问题后续标注)。......
  • Elasticsearch Head插件使用小结
    作者:崔雄华1ElasticsearchHead是什么ElasticSearchhead就是一款能连接ElasticSearch搜索引擎,并提供可视化的操作页面对ElasticSearch搜索引擎进行各种设置和数据检索......
  • ElasticSearch-8.0初识
    Elastic版本更迭历史发布日期版本号时间间隔2010-05-14V0.72014-02-14V1.01372天2015-10-28V2.0621天2016-10-26V5.0364天2017-11-14......
  • AWS-自建集群K8s-Master控制面板
    control-planeinit-kubeadm.yaml#catinit-kubeadm.yamlapiVersion:kubeadm.k8s.io/v1beta3bootstrapTokens:-groups:-system:bootstrappers:kubeadm:defaul......