ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

10分钟上手Semgrep:从安装到跑通第一次静态分析扫描

10分钟上手Semgrep:从安装到跑通第一次静态分析扫描 10分钟上手Semgrep从安装到跑通第一次静态分析扫描【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrepSemgrep 是一款能读懂代码的轻量级静态分析工具你用写源码的方式写规则它在 30 多种语言里找出同一类 bug 的所有变体。这篇指南不假设任何前置知识目标是 10 分钟内让你装好它、看到第一条扫描结果并写下第一条自己的规则。为什么你需要一个会读代码的扫描器假设你的代码库有 200 个 Python 文件你想揪出所有没加 SSL 校验的requests.get调用。用 grep 搜字符串 requests.get你能找到 37 处然后一个个点开看而requests.get(url)和requests.get(url suffix)写法不同、语义相同正则更难伺候。缺的是一个理解代码结构、而不是字符匹配的工具。Semgrep 静态分析就是干这个的规则长得和你写的代码一模一样它负责找出这种代码形状的所有变体——变量名不同、参数个数不同、换行不同都躲不掉。最受益的三类人想统一团队编码规范的开发者、排查危险 API 调用的安全同学、以及被正则表达式折磨怕了的任何人。30秒先跑通一条命令装好 Semgrep 先装。Linux、macOS、WSL 都是一行Windows 原生环境建议看下一节对比表里的 Docker 方案python3 -m pip install semgrep装完立刻验证安装是否成功能打印出版本号就说明可用semgrep --version现在不用写任何配置就能扫第一次。这条命令在当前目录里查找变量和自己比较$X $X几乎必然是笔误semgrep --lang python -e $X $X .终端列出文件:行号就算跑通了显示 0 条也是正常结果只说明代码里没这种笔误。它凭什么不一样读懂代码而不是搜文字用一个具体对比。找代码里的数字 2grep 2相当于在 Word 里按 CtrlF只匹配字面上出现 2 的位置x 1 1不会命中注释里的# 共 2 种情况反而误报。Semgrep 搜 2 更像请了个读过代码的同事来翻它知道1 1求值就是 2所以x 1; y x 1里的y x 1也能命中这是 README.md 里的官方例子。底层靠的是两个记号。省略号...表示任意参数或任意代码print(...)能匹配print(x)也能匹配print(a, b, sep-)$开头的元变量是通配符$X $X意思是同一个东西跟自己比。会用函数签名写代码就会写规则。下图里上下两块都是正常源码上面是规则下面是测试代码高亮那行就是命中处安装方式怎么选一张表看明白方式命令适合谁一句话优缺点pippython3 -m pip install semgrep跨平台、最常见官方主路径、升级方便要求 Python ≥3.10建议在虚拟环境里装Homebrewbrew install semgrepmacOS 用户一条命令、随 brew 升级省心仅 macOS 可用Dockerdocker run --rm -v ${PWD}:/src semgrep/semgrep semgrep scan不想动本机环境、CI 里用零依赖、环境一致首次拉镜像慢需挂载项目目录源码构建见下方流程想参与贡献、改核心引擎能跑最新代码和完整测试需 OCaml 工具链opam、gcc、dune构建最慢选法只是扫代码 → pipMac 上 → brew容器或 CI → Docker要改源码 → 源码构建。源码构建先克隆仓库git clone https://gitcode.com/GitHub_Trending/se/semgrep然后在仓库目录依次执行make setup装 OCaml 依赖、make all编译、make install装到 PATH。这三个目标的用途在根目录 Makefile 的注释里写得很清楚。配置你的第一次扫描写一条最小规则装好后你想把规则沉淀下来。在项目根目录建一个my-rules.yml名字随意内容就一条规则rules: - id: no-print-in-prod pattern: print(...) message: 生产代码请用 logging禁止 print severity: WARNING languages: [python]逐字段说明id是规则名结果里会打印它也用来去重pattern是匹配目标写成源码...代表任意参数所以print(x)和print(a, b)都能命中message是命中时展示的文字severity是严重级别常用 INFO / WARNING / ERRORlanguages限定规则作用的语言这里只扫 Python不碰其他文件。然后运行semgrep --config my-rules.yml .跑完终端会按文件 → 规则 id → message → 命中代码行列出结果大致长这样再补两个马上用得到的行为Semgrep 会读取项目根目录的.semgrepignore把dist/、*.min.js之类写进去即可跳过规则里加fix:字段就能自动改写本仓库 semgrep.yml 里就有现成例子如fix: List_.map2配合--fix参数直接替换代码。踩坑与排查 ⚠️现象semgrep: command not found。原因pip 装进了未激活的虚拟环境或 user 目录的 bin 不在 PATH。一句话解决先用python3 -m semgrep --version绕过 PATH确认可用后再激活环境或补 PATH。现象pip install semgrep报Requires-Python 3.10。原因当前版本要求 Python 3.10见 cli/pyproject.toml 的requires-python。一句话解决升级 Python或为你的 Python 版本固定安装一个旧的 semgrep。现象规则明明能命中结果却是 0 条。原因最常见是languages与实际文件类型不符或路径被.semgrepignore排除了。一句话解决把具体文件路径直接传参semgrep --config my-rules.yml 那个文件.py排除忽略规则干扰。现象pattern 看着对却报错或不命中。原因按正则的习惯写了比如print\(。一句话解决pattern 是代码不是正则去掉转义通配用...和$X。现象--config auto或semgrep ci提示要登录。原因这两个模式从在线规则仓库拉配置需要账号。一句话解决纯本地使用不需要登录写本地规则文件加--config即可。接下来做什么学真实写法tests/patterns/ 里 3000 多个规则测试用例覆盖 30 多种语言随便打开一个看元变量和patterns怎么组合。抄生产级规则集perf/r2c-rules/ 是官方 CI 自用的规则django、flask、java、javascript 等按需摘用。看项目自己怎么查自己根目录 semgrep.yml 是这套仓库的自检规则含 OCaml/Python 专项规则和fix自动修复字段是规则 自动修最好的范本。【免费下载链接】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),仅供参考
返回列表