首页/开发/代码质量与评审速查/Semgrep:轻量模式匹配扫描
规范与静态检查65 条

Semgrep:轻量模式匹配扫描

Semgrep 用近似语法的模式(pattern)在代码中搜索反模式:自带 registry 规则集,也可写项目自定义规则,适合把团队事故经验沉淀成可执行检查。

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 观察,再挑出与团队实际痛点相关的规则固化成项目规则集。

易错点

  • 自动规则集全开:大量低置信告警,团队很快麻木并整体忽略
  • 自定义规则不写测试例:规则误报回归无从发现,可信度下滑
  • 命中即阻断却无豁免流程:合理例外无路可走,最终整条规则被关掉
  • 把生成的目录也纳入扫描:结果里混入第三方代码,真实问题被稀释

数据来源与参考

  • Semgrep 官方文档(semgrep.dev/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌