Semgrep 静态分析:把代码漏洞拦在合并前
2026/9/10 13:09:59 网站建设 项目流程

Semgrep 静态分析:把代码漏洞拦在合并前

【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep

提测前才靠人肉翻代码,翻出一段手拼 SQL 的接口——这类问题往往不在显眼位置,而是藏在角落的分支里。Semgrep 静态分析工具就是干这个的:用长得像源码的模式描述检查项,在本地把 bug 变体扫出来,让问题停在合并之前。

你可以把它当成语义化的 grep:搜x = 1; y = x + 1,它不会只匹配字符串2。它支持 30 多种语言,扫描在本地完成,代码默认不上传。一个人想在提 PR 前快速自查,或团队想把编码约定固化成检查,都能直接上手。

🚀 第一条扫描命令怎么跑

安装只有一行:

pip install semgrep

这条命令直接装好现成的二进制包,不需要从源码编译。装完可以用semgrep --version确认版本。

然后指着你想检查的目录,跑第一条扫描:

semgrep scan --config auto .

auto会从官方规则库拉一套默认规则集,并自动识别项目语言。不用先写规则,就能立刻看到结果。

扫描输出怎么读

输出分三层,顺序看就行:

  • 顶部:每种语言加载的规则数 × 目标文件数。某个文件没被扫到,多半先在这里找原因。
  • 中间:进度条,表示扫描任务走到哪。
  • Findings:每条问题给出规则 ID、文件、行号,附一句解释。按 severity 处理:ERROR必修,WARNING建议修,INFO可以缓一缓。

想把结果接进自动化流程,加--error参数:有任何发现就返回非零退出码,脚本可以直接拿来判断。

✍️ 什么时候需要自己写 Semgrep 自定义规则

官方规则覆盖常见安全问题,但团队的约定各不相同。比如"禁止 print(),强制走日志",这种内部检查写成 YAML 只要五行:

- id: no-raw-print languages: [python] pattern: print(...) message: 用 logging.debug() 代替 print() severity: WARNING

把这条规则放进.yaml文件的rules:下面,扫描时用--config指向它。关键在pattern:它和源码长得一样,...是通配,参数名可以用$X占位。把 pattern 换成open(..., "w"),就是一条新规则。比记正则或啃 AST 的成本低得多。

规则和一段测试代码并排放着,能立刻看出 pattern 命中了哪一行,改完就能验证:

🛡️ Semgrep CI 配置:问题怎么在合并前被拦下

手动扫描靠自觉,放进流水线才能保证每次都跑。最短配置就两行:在流水线里指定官方 Action,configauto

背后的机制很简单:扫描发现有问题就返回非零退出码,构建直接失败,合并被卡住。问题在评审前就暴露出来,修复的还是提交者本人,上下文最热。

想更精确一点,把本地的semgrep scan换成semgrep ci子命令:它只报本次 PR 引入的问题,历史遗留不会一直追着你不放。

❓ 三个常见情况,现象、原因、处理

现象:扫描跑完了,某个目录完全没有结果。原因:目录被默认忽略规则排除(node_modules.git之类),或者该目录的语言没有任何规则匹配。 处理:先看输出顶部每种语言的文件数;确实要扫,用--include显式指定路径。

现象:规则文件加载报错,指向某一行。原因:规则不符合 schema,常见是漏了severity,或 pattern 写法不被识别。 处理:先跑semgrep scan --validate --config 你的规则.yaml校验,按提示修好再正式扫。

现象:CI 一直红,本地扫描却是干净的。原因:两处规则集版本不一致,或者 CI 扫的是整个分支、本地只看改动文件。 处理:固定规则集版本;CI 侧改用semgrep ci子命令,只关注本次 PR 引入的问题。

延伸入口

  • 内置安全规则集:Python、JavaScript、Java 等多语言的现成规则文件
  • 单文件示例:Python 安全规则:带 metadata、fix-regex 的完整规则写法
  • 规则格式定义:规则报"字段不认识"时先查这里
  • scan 子命令源码:上文所有参数的入口
  • 规则测试用例集:仓库自己怎么验证规则匹配的

【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询