Gosec 是 Golang 安全检查器,通过扫描 Go AST 检测硬编码凭据、命令注入等漏洞;它默认不启用,需在 .golangci.yml 中显式配置 enable: - gosec 并合理设置 excludes 与 confidence 才生效。

gosec 是什么,为什么必须显式启用
gosec 是 golangci-lint 集成的专用安全扫描器,它能识别硬编码密码、不安全的随机数生成、exec.Command 注入、http.Redirect 未校验跳转等典型漏洞模式。但它默认**不启用**——即使你装了最新版 golangci-lint,运行 golangci-lint run 也不会触发 gosec 检查。这是设计使然:安全扫描开销大、误报率相对高,需开发者主动选择承担成本。
在 .golangci.yml 中启用 gosec 的最小配置
把下面这段加进项目根目录的 .golangci.yml 文件里即可生效:
linters:
enable:
- gosec
linters-settings:
gosec:
excludes:
- "G104" # 忽略“错误未检查”(常与 errcheck 冲突)
- "G307" # 忽略“os.Open 后未检查 error”(常与 govet 重叠)
confidence: "medium" # 可选:low/medium/high,默认 medium
severity: "high" # 可选:low/medium/high,默认 high-
excludes推荐至少加G104和G307,否则会和errcheck、govet大量重复报错 -
confidence控制检测精度:设为low会扫出更多疑似问题(含更多误报);high则只报高置信度结果 - 不要删掉
gosec下的excludes块——空块会被忽略,等效于没配
常见报错和绕过方式
运行时遇到 gosec: failed to load packages: no Go files in ...,通常是因为:
- 当前目录下没有
.go文件(比如你在cmd/子目录下执行,但配置文件在项目根目录) -
go.mod缺失或路径不合法,导致gosec无法解析包依赖 - 用了
go.work但golangci-lint版本 go.work)
解决办法:确保在项目根目录(含 go.mod)执行 golangci-lint run;升级到 v1.55.0+(截至 2026 年 10 月,v1.57.2 是稳定推荐版)。
立即学习“go语言免费学习笔记(深入)”;
CI 中启用 --fix 时的注意事项
gosec **不支持自动修复(--fix)**。如果你在 CI 脚本里写了:
golangci-lint run --fix
它会对 gofumpt、revive 等支持 fix 的 linter 生效,但对 gosec 完全静默——既不报错也不修复。别指望它帮你改掉 log.Printf("%s", userinput) 这类问题。
真正要落地安全审计,得靠两件事:一是把 gosec 加进 .golangci.yml 并定期跑;二是人工 review 报出来的 Gxxx 规则项——比如 G404(弱随机数)、G201(SQL 注入风险)这类,必须人看,不能跳过。


















