Semgrep 实操指南:三步完成第一次代码扫描并接入 CI
【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep
Semgrep 是一款开源静态分析工具,把扫描规则写成“长得像源码”的代码,支持 30 多种语言,适合想为项目补充代码缺陷与安全检查的个人开发者和团队维护者。下面按三个任务推进:先跑通扫描,再写自己的规则,最后接入 CI。
✅ 让第一次扫描跑通:安装 Semgrep 并完成验证
第一步:获取代码并安装 CLI。克隆仓库后安装依赖:
git clone https://gitcode.com/GitHub_Trending/se/semgrep cd semgrep pip install -e .配置文件位于 cli/pyproject.toml,-e表示开发模式安装,后续改动本地代码可以即时生效。如果只想使用发行版,pip install semgrep一条命令即可,不必克隆源码。
第二步:执行扫描并读懂输出。进入目标项目根目录运行:
semgrep scan --config auto--config auto会根据项目里出现的语言自动挑选规则集。输出分两部分:顶部是按语言汇总的规则数与文件数(截图所示为 54 条规则覆盖 36 个文件,外加 js、json 各自的规则),随后逐条列出发现项,包含文件名、规则 ID、说明和触发行。看到类似结构就说明工具可用了。
两个使用细节值得注意:一是它按语法匹配而非按字符匹配,模式$X == $X能命中任意变量名的a == a;二是 auto 配置需要访问远端规则库,若环境不通网络,可以跳过这一步,直接用本地规则文件,方法见下一个任务。
🧩 写出自己的规则:拦截 Python 项目里的 print() 调用
内置规则覆盖不了团队自己的约定,这时需要自己写。规则是 YAML 文件,一条规则由四要素组成:唯一id、适用语言languages、提示语message、匹配条件pattern。以“禁止生产代码使用 print()”为例:
rules: - id: python-no-prints-in-prod languages: [python] message: Use logging.debug() instead of print() pattern: print(...) severity: INFO把它存为项目内的rules/no-prints.yml,再用--config指向它:
semgrep scan --config=rules/no-prints.yml .pattern中的...是通配符,表示匹配任意参数的 print 调用。运行后输出里只会命中这一条规则,截图中高亮的就是被规则匹配到的 print 语句。
还可以用patterns(复数)组合多个条件,比如用pattern-inside把范围限定在“导入了 yaml 的文件内”,条件越精确,误报越少。
⚙️ 接入 CI:让每次提交都自动触发扫描
规则定型后,把执行交给流水线。Semgrep 官方提供了 GitHub Actions、GitLab CI、Jenkins 等平台的集成入口,在 pull request 上触发时只报告本次 PR 新引入的问题,历史存量不会阻塞新代码。在工作流里加一个 step 即可:
- name: Run Semgrep on PR uses: returntocorp/semgrep-action@v1 with: config: auto如果想让规则跟着仓库版本走,把config改成规则文件的相对路径,之后检查标准与代码同一次提交、同一次回滚。
避开这些坑:新手高频的三个问题
- 扫描很慢怎么办?auto 配置会加载全量规则,耗时大致与规则数成正比。用
--config收窄为本地规则子集,并用--exclude跳过生成目录和依赖目录。 - 发现项都是问题吗?社区版分析范围限于单个函数或文件,存在误报。逐条核对规则 ID 与说明,确认长期误报后用
--exclude-rule=<规则id>排除,而不是整单忽略。 - 与现有 Python 环境冲突?改用 Docker:
docker run -it -v "${PWD}:/src" semgrep/semgrep在隔离容器内直接扫描,免去本地安装的依赖冲突。
延伸学习:沿这些路径继续深入
- 现成的安全规则模板:perf/r2c-rules/,其中 python.yml、javascript.yml 可直接复制改写;
- 海量匹配模式案例:tests/patterns/,三千多个 pattern 测试用例;
- 数据流(污点)规则示例:tests/tainting_rules/,了解 source 到 sink 的写法;
- 规则字段定义:interfaces/rule_schema_v1.yaml,遇到不认识的字段时查阅。
下一步建议:先在自己的小项目上跑一次--config auto,从结果里挑两三个真实存在的问题,把它们改写成第一份自己的规则文件。
【免费下载链接】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),仅供参考