☰
10 分钟用 Semgrep 跑通第一遍代码安全扫描,规则怎么写、误报怎么治
2026/10/5 14:37:06 网站建设 项目流程

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 auto

auto 会自动探测项目语言,从规则注册表拉取对应规则集。几秒后终端出现 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: INFO
semgrep 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询