news 2026/9/10 9:12:06

Semgrep 快速入门:扫描第一个代码并编写规则全流程拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Semgrep 快速入门:扫描第一个代码并编写规则全流程拆解

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/src

auto 会自动检测目录的语言构成,拉取对应社区规则集开始扫描。

你会看到:开头列出目标包含哪些语言、每种语言匹配多少规则、多少文件,随后进度条走完,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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 9:11:48

楼宇微网中的虚拟储能优化调度:从HVAC热惯性建模到MATLAB实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 9:11:46

从源码到部署:hyperframes LiDAR里程计的关键技术与工程实践

1. 为什么我选择了 hyperframes 而不是 LOAM 或 LIO-SAM先说说我接触 hyperframes 的契机。去年我在做一款室外巡检机器人的定位系统,底盘装了 Velodyne VLP-16,需要在地下车库、园区道路这类 GPS 失效的环境里持续输出厘米级里程计。最开始试了 LOAM 系…

作者头像 李华
网站建设 2026/9/10 9:09:01

Swin-Transformer水果图像分类迁移学习实践指南

简介:面向图像分类与迁移学习实践者,这是一套基于Swin-Transformer的水果十二分类图像识别项目,可直接运行并支持替换为自己的数据集。数据集涵盖香蕉、苹果、西瓜等12类水果,包含2340张训练图片与581张预测图片;模型采…

作者头像 李华
网站建设 2026/9/10 9:06:18

结果驱动的夹具动态选择:测试用例依赖与资源装配实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华