被企业禁用的,那些python中的内置强大函数

eval()函数是Python/ target=_blank class=infotextkey>Python的内置函数,功能非常强大,但是存在不小的安全隐患 。有些企业或项目出于安全考虑,禁止使用eval()函数,会在一些安全相关的扫描校验中进行识别和拦截,杜绝使用 。
究竟eval()函数强大在哪?又有什么安全隐患?本文将逐一进行总结分析 。

被企业禁用的,那些python中的内置强大函数

文章插图
 
eval()函数介绍
eval()函数语法:
 
eval(expression[, globals[, locals]]) expression: 字符串表达式 。globals: 可选参数,全局变量,如果设置,则必须是一个字典对象 。locals: 可选参数,局部变量,如果设置,则可以是任何映射(mApping)对象 。如果只设置了globals,locals默认与globals一样 。
 
eval()函数的作用是将字符串当成有效的表达式来求值并返回计算的结果 。相当于去掉字符串首尾的引号,并执行去掉引号后的语句,返回执行的结果 。
主要效果体现为:
 
  • 执行一个字符串表达式,并返回表达式的值 。
  • 将字符串转成对应格式的数据对象(如int、list、tuple或dict) 。
 
eval()函数的强大功能
1.执行字符串表达式并返回结果 。
# 计算表达式 s = eval("5 + 7") print('s: ', s) s1 = eval('[i for i in range(10)]') print('s1: ', s1) 1234512345
Output:
s: 12 s1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1212
eval()可以对字符串中的数字加法进行计算,返回计算结果 。也可以直接执行字符串中的列表推导式这类表达式,返回执行的结果 。
2.执行表达式时支持将变量传到字符串中 。
# 传入变量 x = 111 s2 = eval("123 + x") print('s2: ', s2) # 设置globals y = 2222 s3 = eval("1234 + y", {"y": 1111}) print('s3: ', s3) # 设置globals, locals z = 22222 s4 = eval("12345 + z", {"z": 11111}, {"z": 33333}) print('s4: ', s4) 123456789101112123456789101112
Output:
s2: 234 s3: 2345 s4: 45678 123123
在eval()中执行表达式还支持传参,可以在当前 .py 代码环境中定义变量,也可以通过eval()函数的globals参数和locals参数传值 。优先级locals高于globals,globals高于当前 .py代码环境的变量 。
3.返回对应类型的数据 。
# 将引号中的内容还原成对应类型的数据 sta = '12345' print(type(eval(sta)), eval(sta)) stb = '[1, 2, 3, 4, 5, 6, 7]' print(type(eval(stb)), eval(stb)) stc = '(2, 4, 6, 8, 10)' print(type(eval(stc)), eval(stc)) std = '{"beijing": 1, "shanghai": 2, "guangzhou": 3, "shenzhen": 4}' print(type(eval(std)), eval(std)) 123456789123456789
Output:
12345 [1, 2, 3, 4, 5, 6, 7] (2, 4, 6, 8, 10) {'beijing': 1, 'shanghai': 2, 'guangzhou': 3, 'shenzhen': 4} 12341234
eval()函数直接返回字符串内容对应的数据类型,作用相当于将字符串首尾的引号去掉,如果不用eval(),自己转换数据类型,需要好几个步骤 。
被企业禁用的,那些python中的内置强大函数

文章插图
 
eval()函数经常和input()函数配合使用,直接将用户输入的字符串转换成对应类型的数据 。
eval()函数也经常用于从配置文件中读取内容,读取内容的同时直接转换成对应类型 。
eval()函数的安全隐患
eval()函数功能非常强大,但同时也存在不小的安全隐患,原因正是eval()可以将字符串转成表达式执行 。
# 调用库执行系统命令 import os eval("os.system('whoami')") eval("os.system('echo 123')") 1234512345
Output:
desktop-xxxxxx 123 1212
如果在执行eval()函数的运行环境中导入了os模块,恶意用户可以通过eval()函数调用os模块中的系统命令函数system(),执行一系列的系统命令来达到他的目的 。
如os.system(‘whoami’)可以查看当前系统的登录用户、os.system(‘dir’)可以查看当前目录下的所有文件 。假如执行的是查看源码或删除数据等的命令,将会产生严重的后果 。
针对这种隐患,有没有办法限制用户执行系统命令呢?


推荐阅读