Semgrep 核心功能
三、核心功能
一份规则的主体是「匹配条件」加「元信息」。字段清单如下:
| 字段 | 作用 |
|---|---|
id | 规则唯一标识,建议带团队前缀,便于在报告里定位 |
message | 命中后显示的说明,可用 $X 回填匹配到的内容 |
severity | 严重级别,取值如 ERROR / WARNING / INFO |
languages | 适用语言列表 |
patterns | 多个条件之间是「与」关系 |
pattern | 单条件简写,等价于只有一个元素的 patterns |
paths | 限定生效路径,支持 include 与 exclude |
metadata | 附加信息,常写 cwe、owasp、confidence、category |
组合表达式是写规则的「语法糖」,掌握这几个就够覆盖大多数场景:
| 写法 | 语义 | 典型用途 |
|---|---|---|
pattern-either | 或 | 同一个问题有多种写法,一次全抓 |
pattern-not | 非(排除) | 排除已做安全处理的写法 |
pattern-inside | 限定在某个结构内 | 只看某个类/函数体里的调用 |
pattern-not-inside | 不在某个结构内 | 排除被 try/catch 包裹的调用 |
metavariable-regex | 对元变量内容做正则约束 | 函数名必须形如 exec.* |
metavariable-comparison | 对元变量做数值比较 | 只报长度阈值不达标的密钥常量 |
metavariable-pattern | 对元变量再做一次模式匹配 | 判断参数里是否含某个变量 |
污点模式(taint mode)是判断「真漏洞」还是「看着像」的关键。它要写三部分:pattern-sources 定义污染从哪里来(如 HTTP 请求参数),pattern-sinks 定义危险汇聚点(如命令执行、SQL 拼接),pattern-sanitizers 定义「洗过就干净」的处理(如白名单校验、参数化绑定)。三部分齐了,Semgrep 才能沿着函数调用链判断数据是否真的流到了危险点,误报比单纯 pattern 匹配低很多。
规则单测也是内置能力:规则文件旁边放一个测试文件,用注释标注哪些行应该命中(ruleid:)、哪些不该命中(ok:),再跑 semgrep --test,规则改了会不会误伤一目了然。
关键命令行参数:
| 参数 | 作用 |
|---|---|
--config | 指定规则来源:本地目录、单个文件、或官方规则集标识 |
--severity | 只报告不低于该级别的结果,用于门禁阈值 |
--sarif / --json | 输出机器可读格式,供流水线消费 |
--baseline-commit | 只报告相对某个提交新增的问题,做增量门禁的关键 |
--exclude / --include | 限定扫描范围 |
--error | 有命中时以非零码退出,用于阻断流水线 |
--test | 跑规则自带的测试用例 |

