必须在.golangci.yml中显式启用gosec并配置G101~G602规则,否则扫描失效;需按风险类型理解规则编号,通过exclude/includes或// #nosec控制开关,CI中用--issues-exit-code=1等参数确保卡点有效。

要在Go项目中用golangci-lint集成gosec做安全漏洞扫描,必须明确配置启用gosec并理解其规则编号(G101~G602)对应的真实风险场景,否则扫描结果会大量漏报或误报,CI卡点形同虚设。
确认gosec已作为linter启用
打开项目根目录的.golangci.yml文件,在linters.enable列表中必须显式包含gosec:
- gosec
注意:golangci-lint默认不启用gosec,即使安装了gosec二进制,若此处未声明,【gosec规则将完全不触发】。v2配置中禁用enable-all: true后,遗漏这一行是常见错误。
立即学习“go语言免费学习笔记(深入)”;
理解G系列规则编号与真实风险
G101~G602不是随机编号,而是按风险类型分组。例如:
G101:硬编码凭据(密码、密钥、Token)
G201:SQL注入(字符串拼接构造查询)
G301/G302:不安全的文件权限(0755写入敏感目录、0600用于可执行文件)
G401/G402:弱加密算法(md5、sha1)与不安全TLS配置(InsecureSkipVerify=true)
G501/G505:被弃用的crypto函数(如crypto/md5)与不安全的rand.Read
G601/G602:切片越界访问与map遍历时并发写入
配置gosec规则开关与例外
方法一:全局禁用某条规则(慎用)
在linters-settings.gosec下添加:
exclude: ["G101"]
方法二:按文件/函数临时豁免(推荐)
在代码行上方添加注释:// #nosec G101
方法三:只启用高危规则(适合初期落地)
在linters-settings.gosec中指定:
includes: ["G101", "G201", "G401", "G402"]
这一步必须手动配置,【gosec默认不区分严重等级,所有规则一律启用】,直接跑全量易被低危告警淹没。
让CI真正卡住安全问题
第一步:确保CI中golangci-lint命令带强制失败参数
golangci-lint run --issues-exit-code=1
第二步:跳过非源码路径,避免误报干扰
golangci-lint run --skip-dirs vendor,testdata,examples
第三步:指定输出格式便于定位
golangci-lint run -o ./gosec-report.json --out-format=json
第四步:检查报告中是否含G前缀问题
grep -q '"linter":"gosec"' ./gosec-report.json || echo "gosec未生效"


















