Semgrep 静态代码扫描实战指南:用一行模式抓出代码里的 bug

发布时间:2026/9/10 13:18:11
Semgrep 静态代码扫描实战指南:用一行模式抓出代码里的 bug
Semgrep 静态代码扫描实战指南用一行模式抓出代码里的 bug【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrepSemgrep 是一个开源静态代码扫描工具规则长得就像你平时写的代码本地跑几十秒扫完一个项目把 bug 变种和安全漏洞一条条列出来。从一次 PR review 说起你 review 一个后端 PR扫到一行if password 123456。你想确认的是整个仓库里还有没有别的写死密码、有没有人把exec()喂了用户输入、有没有用http://传敏感数据。靠人肉 grep 一遍慢还漏。Semgrep 想解决的就是这件事——你写一条长得像代码的模式它帮你把所有变体都揪出来。30 秒认识它Semgrep 的定位是语义化的 grep。普通grep 2只匹配字面量2Semgrep 搜2能命中x 1; y x 1这种结构上等价的写法。和同类工具最大的差异你不用学 AST、不用写正则、不用啃 DSL。规则里直接写print(...)或curl(..., timeout...)就行$X代表任意表达式...代表任意内容。它支持 30 语言Python、JS/TS、Java、Go、Rust、Ruby、OCaml……默认在本地跑代码默认不上传。安装后跑通第一次扫描先装。按你的系统选一条# macOS brew install semgrep # Linux / Ubuntu / WSL python3 -m pip install semgrep # 或从源码 git clone https://gitcode.com/GitHub_Trending/se/semgrep然后跑第一条命令。不装任何规则文件直接用-e现写一条模式找 Python 里左右两边相等的多半是笔误semgrep -e $X $X --langpy path/to/src想看真实项目的效果用它仓库根目录自带的规则文件semgrep.yml扫一遍# 用仓库自带的 semgrep.yml 扫描当前目录 semgrep scan --configsemgrep.yml .输出长这样——每条 finding 给出规则 id、命中文件、行号和具体代码行手写一条规则把规则写进一个 YAML放到项目里比如rules/security/。下面这条能直接跑含义是生产代码里别用print改用日志框架rules: - id: python-no-prints-in-prod # 规则唯一标识全局唯一 languages: [python] # 作用的语言 message: 用 logging.debug() 代替 print() pattern: print(...) # 要匹配的代码模式 severity: INFO # INFO / WARNING / ERROR写规则只需要记住三件事字段作用备注id规则唯一名一个文件里不能重pattern匹配什么用$X代变量、...代任意severity严重程度CI 里通常只对ERROR卡合并想看真实项目怎么写的翻仓库根目录的 semgrep.yml——里面有几十条 OCaml/Python 的实战规则比如禁止裸List.map2、禁止在模块顶层读环境变量。写完先本地校验语法别等 CI 才报错semgrep scan --validate --configrules/security/把扫描加进 GitHub Actions一份最小可用的工作流放在.github/workflows/semgrep.ymlname: Semgrep on: [pull_request] jobs: semgrep: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: returntocorp/semgrep-actionv1 env: SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}不想配 token 也能跑——用本地规则文件代替远程配置- uses: returntocorp/semgrep-actionv1 with: config: rules/日常提交前更顺手的方式是pre-commit。本仓库自己就开着配置在 .pre-commit-config.yaml核心就这几行- repo: https://github.com/semgrep/pre-commit rev: v1.171.0 hooks: - id: semgrep args: [--config, tests/precommit_dogfooding/python.yml, --error]--error让扫出问题时退出码非 0提交直接被拦下。踩坑提醒现象跨文件、跨函数的漏洞没扫出来。原因社区版只在单个函数/文件边界内做分析。怎么办跨文件数据流交给 AppSec PlatformPro 引擎能单函数内解决的就写成patterns组合规则。现象print()规则明明写了却一条不命中。原因文件被paths.exclude排掉了或languages和文件后缀对不上。怎么办去掉 exclude 再试确认languages标的是目标文件真用的语言同时检查 .semgrepignore 有没有把路径排除掉。现象--validate报 duplicate rule id 或 pattern 解析错。原因同一文件里两条规则id撞车或pattern语法写错。怎么办id全局唯一先semgrep scan --validate --config...再提交别等 CI 才发现。现象CI 里一跑全是存量问题PR 根本没法合。原因semgrep ci报的是全部历史问题不区分谁新写的。怎么办用 PR 模式它只报本次 PR 引入的 finding让你先上手、存量慢慢清。下一步装好后先敲semgrep -e $X $X --langpy .看第一个命中再读一遍 README.md 的 Getting started把semgrep.yml换成你自己的rules/就能进 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),仅供参考