Semgrep 快速入门:扫描第一个代码并编写规则全流程拆解
【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep
合并 PR 前,你要逐行翻 diff 看有没有人留下硬编码密码、debug print。代码库一大,人肉审查就不可靠了。Semgrep 解决的就是这类问题:用代码形状的模式做静态代码扫描,本地运行,代码不出机器,3 秒内出第一条结果。
3 条命令跑通第一次扫描
这节从空环境走到第一条扫描输出。
步骤 1:安装。
pip install semgrep一条 pip 命令,无额外依赖,macOS 也可以换brew install semgrep。
步骤 2:拿一个有代码的扫描对象。
git clone https://gitcode.com/GitHub_Trending/se/semgrep cd semgrep这个仓库作为练习对象,cli/src 下有上百个 Python 源文件,足够试出扫描效果。
步骤 3:跑第一条模式扫描。
semgrep -e '$X == $X' --lang=py cli/src-e参数接收一条临时模式,匹配所有"变量和自己比较"的恒等式。你会在终端看到 3 秒内逐行列出每个命中文件的路径和行号。
完整走一遍:用自动规则集扫描真实目录
这节以仓库自己的目录为对象,完整走一遍"输入 → 操作 → 输出"。
输入是 cli/src/,一个只含 Python 的目录。操作是一条命令:
semgrep scan --config auto cli/srcauto 会自动检测目录的语言构成,拉取对应社区规则集开始扫描。
你会看到:开头列出目标包含哪些语言、每种语言匹配多少规则、多少文件,随后进度条走完,Results 区域给出结果列表。典型输出长这样:
输出里有 4 个信息值得读。一是规则 id,反向域名式,能直接看出它属于哪个语言、哪类问题。二是文件路径和行号,方便直接跳转。三是命中的代码片段,不用打开文件就知道触发了什么。四是 message,一句话说清问题和修法。扫描结束还会打印汇总:规则总数、文件总数、耗时、发现数,方便你估算自己项目的扫描成本。
写你的第一条扫描规则:逐字段拆解
这节把一个代码习惯变成可复用的规则文件。
规则用 YAML 写,仓库示例目录 tests/rules/ 里有上百个真实样例。最小结构只有 5 个字段:
rules: - id: python-no-print languages: [python] severity: WARNING message: 发现 print,建议改用 logging pattern: print(...)逐字段拆。id 是规则的唯一标识,结果里显示的就是它。languages 声明规则适用语言。pattern 是匹配核心,...代表任意参数。想更灵活时用$X风格的元变量捕获任意表达式;需要限定上下文时,把多个条件包进 patterns 列表,比如仓库模板示例里"只在 bar($Y) 内部才匹配 foo($X)"。
把文件存到你自己的工作目录,命名为 no-print.yaml,跑这条命令验证:
semgrep scan --config no-print.yaml --validate cli/src--validate会逐字段检查规则文件,缺字段或拼错会直接报出位置,不用等扫描失败才发现。
接进 CI 只需一段 YAML
这节把扫描变成每次提交的强制检查。
把下面这段 GitHub Actions 工作流放进你自己项目的 .github/workflows/ 目录:
name: semgrep on: [pull_request] jobs: semgrep: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: semgrep/semgrep-action@v1 with: config: p/security生效后每个 pull request 都会触发一次扫描,有问题构建失败,挡住合并。config 指向官方安全规则集,随时可以换成你上一条规则文件的路径。
CI 之外,pre-commit 钩子里跑一行semgrep scan也能在本地提交前拦截。
避坑清单
- 扫大 monorepo 超时 → auto 规则集会对所有语言全部套用 → 用
--lang限语言或只指定子目录。 --config auto报拉取注册表失败 → 该规则集需要联网访问规则注册表 → 离线环境改用--config指向本地规则文件。- 规则一条都没命中但语法看着对 → languages 声明和文件扩展名对不上 → 先跑
--validate,再拿小文件验证。 - 结果列表太长看不完 → 社区规则集含大量低严重度发现 → 加
--severity ERROR只看高危。 semgrep ci提示要登录 → 该子命令面向平台协作、需要账号 → 纯本地使用就用semgrep scan。
延伸入口
三份材料,够你继续往下挖。
- 官方文档与使用说明:README.md
- 规则示例目录:tests/rules/
- 贡献与社区协作:CONTRIBUTING.md
下一步可以做一个具体动作:先在你自己的项目上跑一次--config auto,再把团队的一条编码约定写成规则接进 CI,让扫描从"能跑"变成"能卡口"。
【免费下载链接】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),仅供参考