Semgrep 是什么
Semgrep 用近似语法的模式(pattern)在代码里搜索反模式:写「长得像代码」的片段,而不是抽象语法树查询,学习成本低。它自带官方 registry 规则集(以 p/ 开头的标识),也支持项目内自定义规则。最大的价值在于把团队事故经验沉淀成可执行检查——同类问题第二次出现时由工具自动指出,而不是靠评审者记性。
基本信息
| 用法 | semgrep --config auto / --config <规则集或文件> |
|---|---|
| 规则 | YAML 声明 pattern、message、severity、languages |
| 规则集 | registry 里的 p/ci、p/security-audit 等 |
| 集成 | CI 中用退出码判定,或输出 SARIF 供平台解析 |
| 适用 | 多语言:Python、Java、Go、JS/TS、PHP 等 |
典型使用场景
- 把复盘结论写成规则:禁止某种不安全的调用方式或参数组合
- 在 CI 中对新增代码跑安全与规范规则,命中即失败
- 跨仓库统一检查:同一套规则订阅给多个项目
- 迁移期检查遗留写法是否清干净(旧 API、废弃字段)
- 评审前自查:本地跑一遍比等评审提出更省时间
- 把第三方库的已知误用模式固化成规则,降低学习成本
运行示例
运行示例
semgrep --config auto # 自动挑选规则(适合先试跑)
semgrep --config p/ci --severity ERROR # 只报 ERROR 级
semgrep --config rules.yaml src/ # 项目自定义规则
semgrep --config p/ci --error # 有命中则退出码非 0
semgrep --config p/ci --sarif -o out.sarif # 输出 SARIF 给平台
# 自定义规则片段(rules.yaml)
# rules:
# - id: no-eval
# languages: [python]
# message: 禁止使用 eval,改用 ast.literal_eval
# severity: ERROR
# pattern: eval(...)常用参数
| 参数 | 作用 | 使用建议 |
|---|---|---|
| --config | 指定规则集或规则文件 | 自定义规则纳入仓库评审 |
| --severity | 过滤严重级别 | CI 先只拦 ERROR |
| --error | 有命中时返回非 0 | 门禁判定用 |
| --sarif | 输出标准结果格式 | 接平台做趋势看板 |
| --exclude | 排除目录 | 跳过生成代码与测试数据 |
自定义规则需要测试例:给每条规则配一个「应命中」和一个「不应命中」的样例文件,否则规则改坏或误报回归时不会有人发现,规则本身也会慢慢失去信任。
把 auto 规则集整包接进门禁通常不可行:低置信告警量大,团队很快对结果脱敏。稳妥做法是先用 auto 观察,再挑出与团队实际痛点相关的规则固化成项目规则集。