Semgrep 是什么:概念介绍
一、Semgrep 是什么:概念介绍
Semgrep 是一个轻量的静态代码分析工具,它把源码解析成语法树(AST),再拿你写的「模式」去匹配。最大的特点是规则的写法长得像源码本身:想找「把用户输入拼进 SQL 字符串」的地方,你就写一个长得像那行代码的 pattern,中间用 $X 这种元变量占位。不需要学一套专门的查询语言,也不用先把整个项目编译起来。
它解决的问题是把代码安全问题左移。等代码上了线再做渗透测试,修复成本高;Semgrep 让「查一个坏模式」变成一条命令、一份 YAML,可以在编辑器里、在提交前、在流水线里反复跑。
与相邻方案的区别:SonarQube 是平台型方案,强在指标统计、质量门禁、历史趋势与团队看板,规则集由官方维护,自写规则的表达力不如 Semgrep,且要额外部署服务端;CodeQL 基于数据库查询语言,做跨函数数据流分析的能力更强,但需要先建库、学习曲线陡、对构建环境有要求;Bandit 专注 Python,规则固定;ESLint 的安全插件只管 JavaScript/TypeScript 一个生态。取舍逻辑大致是:要跨语言、要快速自写规则、要能塞进任何流水线,选 Semgrep;要做深度数据流分析、能投入专人维护,考虑 CodeQL;要的是团队级质量看板与历史指标,选 SonarQube。三者并不互斥,很多团队是 Semgrep 卡提交 + SonarQube 做全局度量。
| 术语 | 含义 |
|---|---|
| Rule(规则) | 一份 YAML 文件,描述「找什么样的代码」以及找到后给什么提示 |
| Pattern(模式) | 匹配逻辑的主体,写法接近源代码 |
| Metavariable(元变量) | 形如 $X、$FUNC 的占位符,匹配任意表达式并可在 message 中回填 |
| taint mode(污点模式) | 追踪数据从「来源」经「传播」到「汇聚点」的路径,用于判断用户输入是否真的流到了危险函数 |
| pattern-either | 「或」关系,任一子模式命中即命中 |
| pattern-not | 「排除」关系,命中但满足该子模式的不算 |
| SARIF | 静态分析结果的通用交换格式,可被代码扫描面板与流水线消费 |
| Registry | Semgrep 官方的规则仓库,可按包名引用别人的规则集 |
| nosemgrep | 行内注释,标记「这处不再报」,属白名单机制 |
红线前置:Semgrep 扫描的对象必须是自有代码库,或你已获书面授权可以扫描的代码。委托外部代码、合作方仓库、开源项目镜像都要先确认授权范围(哪些仓库、哪些分支、扫描结果能否外发)。扫描报告里会包含未修复漏洞的具体位置与利用思路,属于敏感材料,不要贴进公开渠道。

