mimtproxy 记录打印所有POST请求的JSON参数 ,对get请求不处理
时间: 2025-09-01 19:52:55 AIGC 浏览: 19
<think>
我们被要求使用mitmproxy记录并打印所有POST请求的JSON参数,且不处理GET请求。
根据引用[1]中提到的,我们可以编写一个mitmdump扩展脚本(类似log_handler.py)来实现。
在mitmproxy中,我们可以编写一个addon,通过捕获http请求,然后判断请求方法,如果是POST,则解析请求体中的JSON参数并打印。
步骤:
1. 创建一个mitmproxy的addon,定义一个request事件处理函数(因为我们需要处理请求)。
2. 在事件处理函数中,判断请求的method是否为"POST"。
3. 如果是POST请求,尝试获取请求体(content)并解析为JSON。
4. 打印JSON参数。
注意:我们不需要处理GET请求,所以GET请求直接忽略。
由于我们只需要打印,不需要修改请求或响应,所以处理request事件即可。
另外,我们需要注意,有些POST请求可能没有JSON数据(比如表单数据),我们只处理Content-Type为application/json的请求?但是题目要求是打印JSON参数,所以如果请求体不是JSON格式,我们可能无法解析,此时可以忽略或者打印错误信息。不过题目要求打印JSON参数,所以我们可以只处理能够解析为JSON的请求体。
但是题目要求是“所有POST请求的JSON参数”,所以我们可以尝试解析每个POST请求的请求体为JSON,如果解析失败,可以选择忽略(或者打印错误,但要求是打印JSON参数,没有就不打印)。
因此,我们将:
- 过滤出POST请求
- 尝试解析请求体为JSON
- 如果解析成功,则打印JSON参数
代码示例:
我们将编写一个addon,其中包含一个`request`方法(实际上是处理请求的事件,在mitmproxy中,请求事件名为`http_connect`, `request`等,我们这里需要的是`request`事件,即在请求发送到服务器之前)。
但是注意:如果我们要读取请求体,我们需要在请求被发送前拦截,所以使用`request`事件。
在mitmproxy中,事件处理函数是`request(self, flow: mitmproxy.http.HTTPFlow)`。
实现:
1. 导入必要的模块:json
2. 定义一个addon类,比如叫做`LogPostJson`
3. 在类中定义`request`方法
4. 在`request`方法中,检查flow.request.method是否为"POST"
5. 如果是,则获取请求体(flow.request.content)
6. 尝试用json.loads解析请求体,如果解析成功,则打印解析后的JSON对象。
但是注意:有些POST请求可能没有请求体,所以先判断是否有请求体(即content不为空)。
代码示例:
```python
import json
from mitmproxy import http, ctx
class LogPostJson:
def request(self, flow: http.HTTPFlow):
if flow.request.method == "POST":
# 检查是否有请求体
if not flow.request.content:
ctx.log.info("POST请求无内容。")
return
# 尝试解析JSON
try:
json_data = json.loads(flow.request.content)
# 打印JSON数据
ctx.log.info(f"捕获到POST请求的JSON参数: {json.dumps(json_data, indent=2)}")
except json.JSONDecodeError:
ctx.log.warn("无法解析为JSON: " + flow.request.content.decode('utf-8', errors='ignore'))
# 创建addon实例
addons = [
LogPostJson()
]
```
但是,我们还需要注意,有些请求可能是二进制数据,我们尝试用utf-8解码,但在打印错误信息时,我们只打印前一部分或者忽略错误。
另外,我们只关心POST请求,GET请求完全忽略。
使用方法:
mitmdump -s 上述脚本的名字.py
这样,所有经过mitmproxy的POST请求的JSON参数都会被打印到控制台。
但是,如果我们需要将日志实时输出到其他地方(比如web界面),可以参考引用[1]中提到的,结合redis和websocket。不过题目只要求打印,所以上述脚本即可满足。
但是题目要求是“记录并打印”,所以打印到控制台已经满足。
另外,注意:mitmproxy默认只处理HTTP请求,不处理HTTPS,如果需要处理HTTPS,需要安装证书。
因此,我们提供上述脚本来完成任务。
注意:我们使用了ctx.log.info来打印信息,这样可以在mitmproxy的控制台或日志中看到。
如果用户想要将日志输出到文件,可以使用重定向或者mitmdump的日志功能(例如,使用`mitmdump -s script.py > log.txt`)。
因此,我们回答了用户的问题:使用上述mitmproxy扩展脚本即可。
生成相关问题:
1. 如何启动mitmdump并加载脚本?
2. 如何处理HTTPS请求?
3. 除了打印,如何将日志实时发送到远程服务器?
4. 如果POST请求包含文件上传(multipart/form-data),这个脚本会如何处理?
5. 如何过滤特定的URL路径?
</think>
### 记录并打印所有POST请求JSON参数的方法
在mitmproxy中实现记录并打印所有POST请求的JSON参数(不处理GET请求),可以通过编写自定义addon脚本实现。以下是完整解决方案:
```python
# post_json_logger.py
import json
from mitmproxy import http, ctx
class PostJsonLogger:
def request(self, flow: http.HTTPFlow):
# 仅处理POST请求
if flow.request.method != "POST":
return
try:
# 尝试解析JSON
json_data = json.loads(flow.request.content)
ctx.log.info(f"捕获POST请求: {flow.request.url}")
ctx.log.info(f"JSON参数: {json.dumps(json_data, indent=2)}")
except json.JSONDecodeError:
# 非JSON格式的POST请求处理
ctx.log.warn(f"非JSON POST请求: {flow.request.url}")
ctx.log.warn(f"原始数据: {flow.request.content.decode('utf-8', 'ignore')}")
```
### 使用说明
1. **保存脚本**:将上述代码保存为`post_json_logger.py`
2. **启动命令**:
```bash
mitmdump -s post_json_logger.py
```
3. **配置代理**:将客户端代理设置为`localhost:8080`
4. **观察输出**:所有POST请求的JSON参数将实时打印在控制台
### 关键技术点
1. **请求过滤**:通过`flow.request.method != "POST"`跳过GET请求
2. **JSON解析**:使用`json.loads()`解析请求内容
3. **错误处理**:捕获`JSONDecodeError`处理非JSON格式POST请求
4. **日志输出**:通过`ctx.log.info()`分级输出日志
### 高级配置建议
1. **过滤特定域名**:添加`if 'example.com' not in flow.request.url: return`
2. **保存到文件**:添加文件写入逻辑替代控制台输出
3. **HTTPS支持**:需安装mitmproxy证书(首次运行时提示操作)
4. **性能优化**:对于大流量场景,添加采样率控制
> 此方法基于mitmproxy的事件驱动架构,通过拦截HTTP请求实现实时日志记录。核心是在`request`生命周期钩子中处理POST请求体[^1]。
阅读全文
相关推荐

















