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
代码写到一定规模,bug 和安全问题就藏在最普通的几行里:a == a这种自比较、生产代码里遗留的print()调用、用 http 而不是 https 启动的服务。Semgrep是一个静态分析工具,它的方式比较特别:用看起来像源代码的模式去扫描你的项目,覆盖 30 多种语言,而且全程本地运行,代码不会离开你的机器。
下面带你花几分钟装好 Semgrep,跑通第一次安全扫描,再写出第一条自定义规则。
5分钟装好:安装并跑通第一条扫描命令
安装很简单,用 pip 就行:
python3 -m pip install semgrep装完就有semgrep命令了。进入项目目录,直接跑自动配置扫描:
semgrep scan --config auto .--config auto会根据项目里检测到的语言,自动从官方注册表挑一套合适的规则,不需要你手工配置。跑完得到的是一份发现清单:文件名、行号、规则说明、修复建议都有:
只想查一个小点的时候,用-e一行直接跑模式,不用写规则文件。下面这条找 Python 里的a == a自比较 bug:
semgrep -e '$X == $X' --lang=py src/$X是元变量,匹配任意表达式。没有规则文件、没有配置,一条命令出结果——这就是 semgrep 怎么用最直接的答案。
看懂 Semgrep 模式,写出自己的规则
普通 grep 只能匹配精确字符串。Semgrep 理解代码语义:搜数字 2,它连x = 1; y = x + 1也能匹配上。
所以规则可以写得跟源码很像。比如想在 Python 里禁用print()调用:
rules: - id: python-no-prints-in-prod languages: [python] # 对 Python 文件生效 pattern: print(...) # ... 表示任意参数 message: "Use logging.debug() instead of print()" severity: INFO五个字段就是一条能用的规则。print(...)匹配任何带任意参数的 print 调用,不需要理解抽象语法树,也不用学新的查询语言——会写代码就会写规则。
常见用法不止安全:禁止危险 API、强制项目编码规范、替换废弃 API,甚至自动改写代码(autofix)。想多看点模式写法,tests/patterns/ 里有大量测试用例,各种语言的模式语法都能翻到。
接入 CI:只报 PR 引入的增量问题
手动跑几次之后,下一步是把它放进流程。
CI是让团队无痛用起来的办法:在构建流水线里跑semgrep ci,它只报告当前 pull request 引入的问题,历史存量不拦路,开发同学能马上接受。平台侧对 GitHub Actions、GitLab CI、Jenkins、CircleCI 这些常见 CI 服务都提供了现成的集成入口:
更轻量的做法也有:
- pre-commit 钩子:每次提交后扫一遍,问题不出本地。
- IDE / MCP 集成:跑
semgrep mcp启动本地 MCP 服务,AI 编码助手就能在你写代码时直接触发扫描,实现在 cli/src/semgrep/mcp/。
它适合谁
- 个人开发者:本地扫描 + 一行式模式查询,零成本。
- 团队负责人:接入 CI,把编码规范和安全红线变成硬约束。
- 安全工程师:沉淀内部规则库,做全项目代码审计。
要说明一个边界:开源社区版在单个函数、单个文件内做分析,跨文件、跨函数的数据流分析需要商业平台。引擎本体是 OCaml 写的,核心逻辑在 src/osemgrep/,规则结构定义在 interfaces/rule_schema_v2.atd——想给项目加新语言或新规则能力,从这两个路径读起。
现在就动手
今晚就在你的项目里装上 Semgrep,跑一次semgrep scan --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),仅供参考