mitmproxy 只拦截指定域名的请求或响应
时间: 2025-07-29 12:28:55 AIGC 浏览: 30
<think>我们需要在mitmproxy中只拦截指定域名的请求或响应。这可以通过在事件处理函数中检查请求的URL来实现。具体步骤:1.在request和response事件处理函数中,检查flow.request.url是否包含指定的域名(或匹配正则表达式)。2.如果匹配,则执行拦截操作(修改请求/响应,记录日志等);否则,直接返回。以下是一个示例,我们将只拦截"example.com"及其子域名的请求和响应。</think>### mitmproxy 拦截指定域名请求/响应解决方案
在 mitmproxy 中拦截特定域名的请求和响应,可以通过检查 `flow.request.host` 或使用正则表达式匹配域名来实现。以下是完整的解决方案:
```python
from mitmproxy import http
import re
# 配置要拦截的域名列表
TARGET_DOMAINS = [
"api.example.com",
"analytics.someapp.com",
"payment.gateway.com"
]
# 使用正则表达式匹配更灵活的域名模式
DOMAIN_PATTERNS = [
r".*\.example\.com$", # 匹配所有子域名
r"tracking\..*\.com$", # 匹配所有以 tracking. 开头的域名
r"^(dev|staging)\.api\." # 匹配开发/预发布环境
]
def is_target_domain(host: str) -> bool:
"""检查域名是否在目标拦截列表中"""
# 1. 检查精确域名匹配
if host in TARGET_DOMAINS:
return True
# 2. 检查正则表达式匹配
for pattern in DOMAIN_PATTERNS:
if re.match(pattern, host):
return True
# 3. 检查子域名匹配(如 .example.com 匹配所有子域名)
for domain in TARGET_DOMAINS:
if domain.startswith(".") and host.endswith(domain):
return True
return False
def request(flow: http.HTTPFlow):
"""拦截指定域名的请求"""
host = flow.request.host # 获取请求的域名
if not is_target_domain(host):
return # 非目标域名,直接返回不处理
print(f"拦截请求: {flow.request.url}")
# 修改请求头示例
flow.request.headers["X-Intercepted"] = "mitmproxy"
# 修改请求体示例(如果是JSON)
if "application/json" in flow.request.headers.get("Content-Type", ""):
try:
import json
data = json.loads(flow.request.text)
data["intercepted"] = True
flow.request.text = json.dumps(data)
except:
pass
def response(flow: http.HTTPFlow):
"""拦截指定域名的响应"""
host = flow.request.host # 响应关联的请求域名
if not is_target_domain(host):
return # 非目标域名,直接返回不处理
print(f"拦截响应: {flow.request.url} -> {flow.response.status_code}")
# 修改响应头示例
flow.response.headers["Server"] = "Intercepted-Server"
# 修改JSON响应体示例
content_type = flow.response.headers.get("Content-Type", "").lower()
if "application/json" in content_type:
try:
import json
data = json.loads(flow.response.text)
if "data" in data:
data["data"]["modified"] = True
flow.response.text = json.dumps(data)
except:
pass
```
### 代码详细解释
#### 1. 域名匹配逻辑
```python
def is_target_domain(host: str) -> bool:
# 精确匹配
if host in TARGET_DOMAINS:
return True
# 正则匹配
for pattern in DOMAIN_PATTERNS:
if re.match(pattern, host):
return True
# 子域名通配匹配
for domain in TARGET_DOMAINS:
if domain.startswith(".") and host.endswith(domain):
return True
```
- **精确匹配**:直接比较域名字符串
- **正则匹配**:支持复杂模式如 `.*\.example\.com$`
- **子域名通配**:使用 `.example.com` 格式匹配所有子域名
#### 2. 请求拦截
```python
def request(flow: http.HTTPFlow):
host = flow.request.host
if not is_target_domain(host):
return # 跳过非目标域名
```
- 在请求阶段检查域名
- 只处理匹配的目标域名
#### 3. 响应拦截
```python
def response(flow: http.HTTPFlow):
host = flow.request.host # 响应关联的原始请求域名
if not is_target_domain(host):
return
```
- 使用请求的域名来判断是否拦截响应
- 确保请求和响应的拦截规则一致
#### 4. 高级域名匹配技巧
**动态域名列表(从文件加载):**
```python
# 从文件加载域名列表
def load_domains_from_file(filename: str) -> list:
try:
with open(filename, "r") as f:
return [line.strip() for line in f if line.strip()]
except:
return []
TARGET_DOMAINS = load_domains_from_file("target_domains.txt")
```
**域名匹配性能优化:**
```python
# 预编译正则表达式提高性能
COMPILED_PATTERNS = [re.compile(p) for p in DOMAIN_PATTERNS]
def is_target_domain(host: str) -> bool:
for pattern in COMPILED_PATTERNS:
if pattern.match(host):
return True
# ...其他匹配逻辑...
```
### 域名匹配的进阶用法
#### 1. 根据请求路径过滤
```python
# 只拦截特定路径的请求
if flow.request.path.startswith("/api/v1/payment"):
# 处理支付相关API
```
#### 2. 组合多个条件
```python
# 拦截特定域名且包含敏感头的请求
if (is_target_domain(host) and
"Authorization" in flow.request.headers):
# 处理认证请求
```
#### 3. 动态启用/禁用拦截
```python
# 全局开关控制
INTERCEPT_ENABLED = True
def request(flow):
if not INTERCEPT_ENABLED:
return
# 正常拦截逻辑
```
#### 4. 使用 mitmproxy 的过滤器语法
```python
# 启动 mitmproxy 时使用过滤器
# mitmproxy -s script.py --set "filter=~d example.com"
# 在脚本中获取过滤器设置
def configure(updated):
if "filter" in updated:
print(f"当前过滤器: {ctx.options.filter}")
```
### 使用示例
1. 创建 `target_domains.txt` 文件:
```
api.example.com
.tracking.company.com # 匹配所有子域名
```
2. 启动 mitmproxy:
```bash
mitmproxy -s domain_interceptor.py
```
3. 配置客户端使用 mitmproxy 作为代理
###
阅读全文
相关推荐


















