一、python中globals与locals介绍

1、介绍

在 Python 中,globals() 和 locals() 是两个内置函数,它们分别用来获取当前作用域的全局和局部命名空间,并以字典的形式返回


globals()

  • 返回一个包含当前模块(通常是当前文件)中所有全局变量和函数的字典。
  • 作用域:全局
  • 生命周期:从模块被加载到解释器退出。
  • 内容:包括在函数外部定义的变量、导入的模块、以及定义的函数和类等

locals()

  • 函数返回一个包含当前作用域内所有局部变量的字典。
  • 作用域:局部作用域(Local Scope),例如在一个函数内部。
  • 生命周期:当函数被调用时创建,函数执行完毕后销毁。
  • 内容:包括函数的参数和在函数内部定义的变量。

2、举例

编写代码获取全局和局部命名空间

import time
def test():
    def b():
        pass
    a="local"
    import requests
    print("全局变量",globals())
    print("局部变量",locals())
a="global"
time.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的安全替代

import ast

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)}")
except Exception as e:
    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()函数替代或建立黑白名单或规则对用户输入过滤以及预处理

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐