一、python中globals与locals介绍1、介绍在 Python 中globals() 和 locals() 是两个内置函数它们分别用来获取当前作用域的全局和局部命名空间并以字典的形式返回globals()返回一个包含当前模块通常是当前文件中所有全局变量和函数的字典。作用域全局生命周期从模块被加载到解释器退出。内容包括在函数外部定义的变量、导入的模块、以及定义的函数和类等locals()函数返回一个包含当前作用域内所有局部变量的字典。作用域局部作用域Local Scope例如在一个函数内部。生命周期当函数被调用时创建函数执行完毕后销毁。内容包括函数的参数和在函数内部定义的变量。2、举例编写代码获取全局和局部命名空间importtimedeftest():defb():passalocalimportrequestsprint(全局变量,globals())print(局部变量,locals())aglobaltime.sleep(1)test()结果如下全局变量键值‘name’‘main’‘doc’None‘package’None‘loader’:_frozen_importlib_external.SourceFileLoader object at 0x000002A237785C10‘spec’:None‘builtins’module ‘builtins’ (built-in)‘file’‘E:\pycharm\app\test\test.py’‘cached’None‘time’module ‘time’ (built-in)‘test’function test at 0x000002A237773D70‘a’‘global’局部变量键值‘b’function test..b at 0x000002A2377E78A0‘a’‘local’‘requests’module ‘requests’ from ‘E:\pycharm\app\test\.venv\Lib\site-packages\requests\init.py’二、eval()函数在python中可以使用eval函数在指定的命名空间中执行字符串表达式以支持在函数中动态执行代码语法及参数如下三、演示分析编写如下python代码演示eval的漏洞和ast.literal_eval的安全替代importast malicious_input__import__(os).system(whoami)safe_input{name: Alice, age: 30}print(f恶意输入:{malicious_input})print(f正常输入:{safe_input}\n)print( 1. 使用 eval() (存在漏洞) )print(f结果{eval(malicious_input)})print(\n 2. 使用 ast.literal_eval() (安全防御) )try:print(f结果:{ast.literal_eval(malicious_input)})exceptExceptionase:print(e)print(\n 3. 验证正常数据解析 )print(f 数据类型:{type(ast.literal_eval(safe_input))})结果如下可以看到eval成功执行了注入的代码但是ast.literal_eval则是抛出异常eval()将字符串当作有效的 Python 代码来执行。如果输入包含恶意代码如删除文件、发起网络请求、导入恶意模块eval() 会照单全收并执行。ast.literal_eval()仅对 Python 的字面量结构进行求值。它只能处理字符串、字节、元组、列表、字典、集合、布尔值和 None。如果字符串中包含函数调用、变量名或运算符它会抛出异常。查看literal_eval函数说明看到其只接收strings,bytes,numbers等类型四、解决方案使用ast.literal_eval()函数替代或建立黑白名单或规则对用户输入过滤以及预处理