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
上周有人把一条直接拼接用户输入的 SQL 合并进了主干,直到上线前评审才被翻出来。Semgrep 能帮你把这类问题拦在合并之前——它是一款轻量级静态代码分析工具,规则长得像源码,扫完逐文件给出具体行号。
🚀 三分钟跑通第一遍 Semgrep 代码安全扫描
安装只用一种方式:
python3 -m pip install semgrep(macOS 可用 brew,不装直接跑 Docker 也行,一行命令的事。)
然后进项目根目录:
semgrep scan --config autoauto 会自动探测项目语言,从规则注册表拉取对应规则集。几秒后终端出现 Results:每条发现都带规则 id、message 说明、文件与行号,并高亮出命中的那一行。
上面这个真实输出:app.js 第 10 行被规则 express-check-csrf-middleware-usage 标记(Express 应用未接 CSRF 中间件),bin/www 第 22 行命中 http 明文服务检查。没有登录、没有配置文件,第一遍体检就是这样开始的。
📝 读懂你的第一条 Semgrep 规则:pattern 的匹配直觉
把下面这条规则存成 no-print.yaml:
rules: - id: no-prints languages: [python] message: "生产代码避免 print,改用 logging" pattern: print(...) severity: INFOsemgrep scan --config no-print.yaml五个字段各司其职,重点看 pattern:...是通配符,匹配任意参数列表,所以print(...)命中一切print()调用——不管传几个参数、传什么。更妙的是它匹配的是语法结构而非文本:字符串里出现print(xxx)字样不会报,print (x)这种写法也会报。想写自己的 Semgrep 规则,记住这条就够了:pattern 写代码片段,Semgrep 负责在 AST 层面找所有同构位置。
不写文件也能试单条模式:
semgrep -e '$X == $X' --lang=py .$X是捕获变量,代表同一表达式:a == a、user == user这类自己和自己比较的笔误都会被打出来。
🤖 把 Semgrep 挂进 CI:选对规则集,每次提交自动体检
规则集按用途挑:auto面向整个项目、按语言自选规则,适合本地摸底;p/security是安全向组合包,适合当 CI 守门;p/owasp-top-ten则对应 OWASP 十大类风险。
以 GitHub Actions 为例,加四行:
- uses: semgrep/semgrep-action@v1 with: config: p/security收益很具体:以前靠人肉 review 兜底的 SQL 拼接、明文 http、硬编码 token,现在每次 push 都会先过一遍规则,发现拦在合并前,责任落在具体某次提交上。本地--config auto、线上p/security两套并存即可。
🧹 误报太多?.semgrepignore、参数筛选与模式写法的避坑姿势
第一遍 auto 扫出一堆"没毛病"的结论很正常,治理路径按顺序走:
- 项目根放一个
.semgrepignore,写法同 .gitignore,一行一个目录,比如vendor/、dist/、生成的代码目录。 - 缩小范围:
--lang=py只扫 Python;--include/--exclude按路径模式包含或排除(两者都命中时跳过该文件)。 - 单条规则不认可:
--exclude-rule=规则id直接排除;临时放行某一行也可在代码里加 nosem 注释。
模式写法上两条最常用:...吞任意数量的参数;$VAR捕获单个表达式且可在一条规则内反复引用($X == $X就是靠它成立的)。别用正则思维写 pattern——你写的是代码,不是字符串。仓库 tests/rules/ 下有大量带对应测试代码的示例,每看一组就能校准一次匹配直觉。
下次评审前,复制这条命令进项目根目录跑一遍:
semgrep scan --config p/security --exclude vendor --exclude dist开头那条 SQL 拼接,就会以一行带行号的发现形式,停在合并按钮之前。
【免费下载链接】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),仅供参考