Semgrep:提交前 30 秒扫一遍代码的静态分析工具
【免费下载链接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.项目地址: https://gitcode.com/GitHub_Trending/se/semgrep
code review 时最烦的不是读新代码,而是把 diff 里每个改动都往安全写法的角度上对一遍,还总漏。Semgrep 的思路很直接:用一段长得像源码的模式去匹配代码,漏掉的pickle、缺参数的exec这类问题,30 秒内列给你看。
装完直接跑,先扫出存量问题
克隆仓库装依赖
git clone https://gitcode.com/GitHub_Trending/se/semgrep cd semgrep pip install -e .跑一次 baseline,只看新增问题
全量扫描的噪音很大,老代码里的历史欠账会把新问题淹没。--baseline-commit只报告相对基线提交新增的发现,提 PR 前拿上一个提交做基线最合适:
semgrep scan --config auto --baseline-commit HEAD~1默认配置会自动按项目里出现的语言挑规则,跑完的输出长这样,左边是命中数,右边是具体代码行:
只扫要审的目录
--include和--exclude接受 glob,把测试目录、生成代码挡在外面:
semgrep scan --config auto --exclude tests --exclude node_modules写一条规则,抓住你团队的坏味道
从内置规则里抄一段
官方规则集就在仓库里,Python 安全规则 这种写法可以直接改着抄。下面是抓pickle的典型片段:
rules: - id: no-pickle languages: [python] severity: ERROR message: 别反序列化不可信数据,换 json pattern: pickle.loads(...)pattern支持省略参数,pickle.loads(x)、pickle.loads(data, protocol=4)都能命中,不用写死参数。
存到项目里跑一次验证
规则放进仓库根目录的semgrep.yml,然后:
semgrep scan --config semgrep.yml命中时会在输出里带上代码行和 message,reviewer 一眼能看懂问题出在哪:
接进流水线,提交即检查
GitHub Actions 加一个 job
- name: Semgrep run: | pip install semgrep semgrep scan --config auto --error--error让命中非零退出,CI 直接红掉,问题拦在合并之前。
其他平台同样一个命令
GitLab CI、Jenkins 都是跑同一条semgrep scan,只是位置不同;仓库里 e2e 测试用的多语言目标项目 可以直接当扫描对象试。官方面向 CI 的命令在 cli/src/semgrep/commands/ci.py,会多输出 SARIF,方便平台展示。
扫得慢、噪音大?三个参数收一收
指定规则子集
auto会拉全部适用规则,大仓库明显变慢。只留你关心的几个文件:
semgrep scan --config perf/r2c-rules/python.yml --config perf/r2c-rules/javascript.yml按规则 id 静音
某条规则误报多,不用删规则,按 id 静音:
semgrep scan --config auto --exclude-rule no-pickle开满并行
默认线程数保守,CI 机器配置好的话直接拉高:
semgrep scan --config auto --jobs 16把no-pickle这条规则存到仓库根目录,CI 里换成--config semgrep.yml --error,下次提交就有机器帮你盯着 diff 了。
【免费下载链接】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),仅供参考