
10 分钟跑通 Semgrep 静态分析用第一条规则抓住漏网的硬编码密钥【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep周五晚上八点上线前最后一轮评审你在代码里翻到一行api_key sk-live-2fa7...——它是怎么逃过前四次 review 的手工审查总有人肉盲区而 Semgrep 静态分析做的事情很直接你写几条长得像源代码的规则它就负责在每次提交和 CI 里反复抓这些问题支持 30 多种语言扫描在本地完成默认不上传任何代码。一分钟认知 先花一分钟对齐概念后面全是动手内容。Semgrep 是一个开源的静态分析工具静态分析不运行代码直接读源码找问题。它的规则不是抽象的 AST 语法树AST把代码解析成的树形结构而是直接写你平时写代码的样子。比如规则pattern: eval(...)它扫到的就是eval(code)、eval( x.strip() )这类同一意图、不同写法的代码变体——这正是普通文本搜索做不到的。它适合谁写业务代码的开发者、想统一团队规范的负责人、需要在 CI 里加一道自动检查的平台工程师。能力维度Semgrep 的表现语义模式匹配规则像源代码可捕获同一写法的各种变体多语言同仓一份配置同时覆盖 Python、Go、JS 等 30 语言污点分析开源版可标记数据源与危险调用点Pro 版支持跨文件追踪输出格式终端、JSON、SARIF 等方便接 CI 和编辑器装好它pip 一条命令主推 pipx 路径独立环境、不污染你项目的 Pythonpipx install semgrep # 安装到独立环境 semgrep --version # 验证打印当前版本号如果机器上没有 pipxmacOS 用brew install semgrep不想装任何东西就docker run --rm -v ${PWD}:/src semgrep/semgrep semgrep --version。装好之后不用急着看文档直接进场景。跑通第一个真实场景 目标扫一个含硬编码凭证的 Python 小项目体验规则即代码。第一步建一个测试目录里面放一个有问题的app.py# app.py API_KEY sk-live-2fa7c91d def check_user(u): return u u # 恒为真的比较典型笔误第二步用内置元变量写一条即席规则。$X $X里的$X是占位符匹配任意表达式这条规则能抓到任何自己跟自己比的代码semgrep -e $X $X --langpy .预期输出里会出现app.py第 4 行的u u并附上规则 id、文件、行号。再执行下面两条分别验证规则文件、缩小扫描范围semgrep --validate -c .semgrep.yml # 校验规则文件是否合法 semgrep -c .semgrep.yml --includesrc/** # 只扫 src 目录四步走完你应该已经能感受到它和普通grep的差别$X $X命中的不是字符串u u而是两边相同这种结构。让它适配你的项目 把上一步的即席规则落成配置文件。在项目根目录新建.semgrep.yml这就是完整的最小可用版本rules: - id: no-dangerous-eval # 规则唯一标识 pattern: $F(...) # $F 匹配任意函数名 patterns: - metavariable-regex: metavariable: $F regex: ^(eval|exec)$ # 只拦 eval 和 exec message: 禁止使用 eval/exec请改用显式逻辑 severity: WARNING # 严重程度INFO / WARNING / ERROR languages: [python]改哪里两处是你最常动的regex和metavariable-regex决定拦哪些函数按团队约定增删languages和--include决定扫哪些语言和目录只扫业务代码、放过node_modules这类目录。改完怎么验证还是那两条semgrep --validate -c .semgrep.yml确认语法合法然后semgrep -c .semgrep.yml .看结果里是否出现no-dangerous-eval这个规则 id。融入日常流程 ⚙️CI 接入只需一段 workflow--error的作用是关键发现规则命中就返回非零退出码流水线直接变红问题卡在合并之前。# .github/workflows/semgrep.yml on: [pull_request] jobs: semgrep: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - run: pipx run semgrep scan --config .semgrep.yml --error --metricsoff如果想更简单--configauto可以用 Semgrep 注册表的默认规则集开箱扫一遍首次使用需要登录账号本地团队自己的约定还是推荐维护.semgrep.yml。完整参数见 README 的 Getting started 部分仓库里的 semgrep.yml 是一份可直接借鉴的规则示例。踩坑速查 ⚠️现象原因解法--validate报规则文件错误id缺失、languages拼写错、YAML 缩进问题先看报错里指到的规则 id 和行号对照仓库里的 semgrep.yml 修正后重跑同一行代码反复报误伤模式写得太宽$F(...)命中了同名普通函数用patterns加metavariable-regex收窄见上文配置确属历史遗留的在命中行尾加# nosemgrep豁免单行抑制生成代码、大文件拖慢扫描速度默认会扫目录下所有可识别文件并自动读.gitignore用--includesrc/**只扫业务目录--exclude排除第三方目录-j控制并行数从规则到习惯到这里你手上已经有一条能跑的规则、一个合法的.semgrep.yml、一段 CI 配置。Semgrep 的静态分析逻辑其实就一句话把团队本来就该遵守的约定写成规则让机器在每次提交时替你盯着人只看机器标出来的少数几处。下一步你可以做什么给项目里最容易被滥用的 23 个 API 各写一条规则跑--validate后提交进仓库把--configauto试一次看看注册表默认规则在你的项目里报出什么再决定留哪些在.semgrep.yml里加一条taint污点追踪数据从源头流向危险点规则体验比纯模式匹配更进一步的检查能力。【免费下载链接】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),仅供参考