正则匹配在做什么
matches 对字符串字段做正则表达式匹配,支持可选值、分组、数量限定以及忽略大小写等标志,比包含判断灵活得多。典型用法是按后缀筛资源类型、按标识筛客户端、按多个候选值一次匹配。代价是开销更大:每个报文都要跑一遍正则引擎,在大文件上可能明显变慢。因此常见做法是先用端口或协议粗筛,再叠加正则条件。它只能用于字符串类型的字段。
基本信息
| 语法 | 字段 matches "正则" |
|---|---|
| 适用类型 | 字符串字段与整条报文,数值字段不可用 |
| 常用标志 | 忽略大小写、多行等,按具体实现支持情况使用 |
| 转义规则 | 反斜杠需要按分析工具的转义规则书写 |
| 性能 | 开销高于包含判断,建议先粗筛再叠加 |
典型使用场景
- 按资源后缀筛选请求:一次匹配多种图片或静态资源类型
- 按客户端标识识别脚本调用:忽略大小写匹配多种客户端名称
- 按路径模式定位接口:匹配带路径参数的接口地址
- 按多个候选值批量筛选:用竖线列出候选串一次匹配
- 在明文内容里做模式检索:找出疑似凭证或令牌的格式
常用示例
常用示例
http.request.uri matches "\\.(png|jpe?g|gif)$" # 静态资源后缀
http.user_agent matches "(?i)curl|python-requests" # 脚本类客户端
http.request.uri matches "/api/v[0-9]+/" # 带版本号的接口
http.host matches "^(api|gw)\\.example\\.com$" # 多个子域名
frame matches "(?i)select .* from" # 明文里检索语句模式与相邻写法对比
| 写法 | 能力 | 适用场景 |
|---|---|---|
| 等号比较 | 完全相等 | 已知完整值,性能最好 |
| 包含判断 | 子串匹配,区分大小写 | 片段匹配且不需要模式组合 |
| 正则匹配 | 支持分组、可选、忽略大小写 | 模式复杂或需要一次匹配多个候选 |
| 集合判断 | 离散取值枚举 | 端口、状态码等有限的取值集合 |
| 组合使用 | 正则加协议字段粗筛 | 大文件上兼顾灵活性与速度 |
先在小样本上验证正则再放大到整个文件,写错时容易得到空结果而不报错。忽略大小写用行内标志最方便,比枚举大小写组合清晰得多。
复杂正则在大型抓包文件上可能扫描很慢,甚至让界面长时间无响应。遇到这种情况先加上端口或地址条件缩小范围,再叠加正则。
组合与排查
组合与排查
tcp.port == 443 && http.request.uri matches "/v[0-9]+/" # 限定端口再匹配路径
http.request.uri matches "\\.(js|css)$" && http.response.code >= 400 # 静态资源报错
!http.host matches "^(api)\\." # 排除部分子域名判读要点
- 结果为空时先简化正则,从最简单的模式逐步加条件验证
- 正则转义在不同环境里写法不同,命令行与图形界面可能都需要额外转义
- 命中内容要看上下文,模式匹配成功不代表这就是问题所在
- 性能敏感场景优先使用等号或包含判断,正则可作为最后补充