Semgrep 快速上手指南:5 分钟写出第一条规则,跑通一次代码扫描
【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep
复盘一次线上告警,你会想起什么
复盘一次线上告警,才发现接口里硬编码的密钥、散在各处的裸print(...)全都没在提交前被拦住。你缺的往往不是更勤的 Code Review,而是一个按"长得像源码"的模式自动查 bug 的静态分析工具——Semgrep:写一条规则,几秒扫完全库,把违规位置一条条列出来。
先给你看一次真实扫描跑起来是什么样子:
⚙️ 环境就位:3 步拿到能跑的 Semgrep
- 拿到代码:
git clone https://gitcode.com/GitHub_Trending/se/semgrep - 装依赖:日常使用装发布版最省事,
pip install semgrep;想读源码、跑测试再进仓库里装 - 验证可用:
semgrep scan --lang=python --pattern='print(...)' .,终端能列出 print 位置就算通了
先别急着配参数。用上面这条命令确认"规则 → 扫描 → 输出"整条链路是通的,后面所有玩法都建立在这条链路上。
🛠 实战任务:写一条规则,把全库的 print 揪出来
目标只有一个:用一条自定义规则扫自己的项目,然后读懂报告。全程 3 步。
1. 写规则:模式即规则
新建rules/no-print.yml:
rules: - id: no-print-in-prod message: 换成 logging,print 不适合生产环境 pattern: print(...) severity: INFO languages: [python]为什么这么做:Semgrep 的规则就是"一段代码 + 一句消息",...是通配符,匹配任意参数。会写 Python 就会写规则,不需要学新语法。
2. 本地跑通
semgrep scan --config rules/no-print.yml .--config指向你的规则文件或目录。第一次跑就扫当前目录,跑通了再扩大范围。在规则编辑器里改 pattern、看匹配,可以实时验证规则对不对:
3. 看懂报告
每条命中都按"文件 → 规则 id → 行号 → 代码上下文"输出,还会带上你写的 message。看懂报告只需盯三件事:
| 报告字段 | 告诉你什么 | 怎么用它 |
|---|---|---|
| 规则 id | 哪条规则命中 | 回规则文件定位 pattern |
| 文件:行号 | 命中位置 | 直接跳转修复 |
| message | 人话解释 | 写清楚,团队才信得过 |
修完重跑,直到 Findings 清零——这就是"规则 → 扫描 → 修复"的最小闭环。
🏭 落地到工程:让规则跟着代码走
规则写出来只是开始,让它每次提交都自动跑才算落地:
- 流水线里加一步扫描,GitHub Actions、GitLab CI、Jenkins 都支持:
- name: Semgrep 扫描 run: semgrep scan --config rules/ --error--error让有发现时以非零码退出,CI 红灯拦住带问题的提交。
- 团队共享规则:把
rules/目录放进代码库,谁提交谁修。仓库里 perf/r2c-rules/ 自带 Python、JavaScript 等多语言安全规则,拿来改改就是团队基线。
⚠️ 避坑:新手最容易踩的 4 个点
- 一次别上太多规则:首扫先跑 1~5 条核心规则,命中多了没人会修,规则库形同虚设。
- 用
--config控制范围:大仓库可指定规则子集或子目录,既快又聚焦;想参考大项目的规则取舍,看 perf/rules/ 的基准规则。 ...通配用狠了会误报:先精确匹配,确认漏报再放宽。- 在意隐私就关指标:默认会采集匿名使用指标,加
--metrics off关闭。
更多可模仿的规则样例在 tests/patterns/,CLI 实现看 cli/。
工具不会替你修 bug,但能让每个问题都有名字、有位置、有人认领。现在就写一条规则,扫一遍你自己的仓库。
【免费下载链接】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),仅供参考