如何使用Mitmproxy筛选包含指定字符串的流量?
在Mitmproxy中筛选包含指定字符串的流量
嘿,这个需求在Mitmproxy里其实有两种常用的实现方式,看你更倾向于快捷操作还是灵活定制:
方法一:用内置过滤表达式(快捷无代码)
Mitmproxy自带了强大的过滤语法,直接用命令行参数或者web界面就能筛选出符合条件的流量。
命令行启动时筛选
启动Mitmproxy的时候,加上-f参数并指定过滤规则:
mitmproxy -f "~s teststring1|teststring2|teststring3"
这里的规则解释:
~s:表示匹配请求或响应的内容(包括URL、请求体、响应体、headers里的文本)teststring1|teststring2|teststring3:用正则的|来表示“或”,只要包含其中任意一个字符串就会被保留
如果只想筛选请求或者响应,可以加上额外的标识:
- 只看包含指定字符串的请求:
mitmproxy -f "~q ~s teststring1|teststring2|teststring3"(~q代表请求) - 只看包含指定字符串的响应:
mitmproxy -f "~r ~s teststring1|teststring2|teststring3"(~r代表响应)
在Mitmweb界面中筛选
如果你用的是可视化的Mitmweb,直接在顶部的Filter输入框里输入同样的表达式就行,实时就能看到过滤后的结果。
如果需要忽略大小写匹配,只要在正则里加(?i):
~s (?i)teststring1|teststring2|teststring3
方法二:自定义Python脚本(灵活定制)
如果你的需求更复杂(比如要同时检查多个位置的内容、加自定义判断逻辑,或者要对匹配到的流量做额外处理),写个简单的Python脚本是更好的选择。
比如创建一个名为filter_target_strings.py的脚本,内容如下:
from mitmproxy import http from mitmproxy import ctx # 定义你要匹配的目标字符串集合 TARGET_STRINGS = {"teststring1", "teststring2", "teststring3"} def request(flow: http.HTTPFlow) -> None: # 合并请求的URL、请求体和headers文本,统一检查 request_content = f"{flow.request.pretty_url}\n{flow.request.text}\n{str(flow.request.headers)}" # 如果不包含任何目标字符串,就从视图中移除该流量 if not any(target in request_content for target in TARGET_STRINGS): ctx.master.commands.call("view.remove", [flow]) def response(flow: http.HTTPFlow) -> None: # 检查响应体内容 response_content = flow.response.text if not any(target in response_content for target in TARGET_STRINGS): ctx.master.commands.call("view.remove", [flow])
然后用这个脚本启动Mitmproxy:
mitmproxy -s filter_target_strings.py
这个脚本的逻辑是:
- 对每个请求,检查URL、请求体和headers里是否包含目标字符串,不包含就移除
- 对每个响应,检查响应体内容,不包含就移除
- 最终你在Mitmproxy里看到的就只有符合条件的流量了
如果需要忽略大小写,可以把匹配条件改成:
if not any(target.lower() in request_content.lower() for target in TARGET_STRINGS):
内容的提问来源于stack exchange,提问作者Marcin Bobowski
相关产品推荐
相关产品推荐

