Go 开发者的安全最佳实践
本页面为 Go 开发者提供有关如何优先考虑项目安全的最佳实践。从使用模糊测试(fuzzing)自动化测试到轻松检查竞态条件,这些技巧都能帮助您的代码库更安全、更可靠。
扫描源代码和二进制文件中的漏洞
定期扫描您的代码和二进制文件中的漏洞有助于及早发现潜在的安全风险。您可以利用由 Go 漏洞数据库 支持的 govulncheck 来扫描代码中的漏洞,并分析哪些漏洞确实会影响您。请通过 govulncheck 教程 入门。
Govulncheck 也可以集成到 CI/CD 流程中。Go 团队在 GitHub Marketplace 上提供了 govulncheck 的 GitHub Action。Govulncheck 还支持 -json
标志,以帮助开发者将漏洞扫描与其他 CI/CD 系统集成。
您还可以通过使用 Visual Studio Code 的 Go 扩展 直接在代码编辑器中扫描漏洞。请通过 本教程 入门。
保持 Go 版本和依赖项的更新
保持您的 Go 版本更新 可以让您获得最新的语言功能、性能改进以及已知安全漏洞的补丁。更新的 Go 版本还能确保与新版依赖项的兼容性,从而避免潜在的集成问题。请查阅 Go 版本历史记录,了解版本之间进行的更改。Go 团队会在发布周期中发布小版本更新,以修复安全漏洞。请务必更新到最新的次要 Go 版本,以确保您拥有最新的安全修复。
保持第三方依赖项的更新对于软件安全、性能和符合 Go 生态系统中的最新标准至关重要。然而,在未经彻底审查的情况下更新到最新版本 也可能存在风险,可能引入新的 bug、不兼容的更改,甚至恶意代码。因此,虽然更新依赖项以获取最新的安全补丁和改进至关重要,但每次更新都应经过仔细审查和测试。
使用模糊测试(fuzzing)来发现边界情况下的利用
模糊测试(Fuzzing) 是一种自动化测试,它利用覆盖率引导来操纵随机输入并遍历代码,以发现和报告潜在的漏洞,例如 SQL 注入、缓冲区溢出、拒绝服务和跨站脚本攻击。模糊测试通常可以触及程序员忽略或认为不太可能发生的边界情况。请通过 本教程 入门。
使用 Go 的竞态检测器来检查竞态条件
当两个或多个 goroutine 同时访问同一资源,并且至少其中一个访问是写入操作时,就会发生竞态条件。这可能导致软件中出现不可预测且难以诊断的问题。使用内置的 竞态检测器 来识别 Go 代码中潜在的竞态条件,这有助于确保并发程序的安全性和可靠性。请注意,竞态检测器在运行时发现竞态,因此它不会发现未执行的代码路径中的竞态。
要使用竞态检测器,请在运行测试或构建应用程序时添加 -race
标志,例如 go test -race
。这将使用启用竞态检测器的模式编译您的代码,并在运行时报告检测到的任何竞态条件。当竞态检测器发现程序中的数据竞争时,它将 打印一份报告,其中包含冲突访问的堆栈跟踪,以及参与的 goroutine 的创建堆栈。
使用 Vet 检查可疑的结构
Go 的 vet 命令 旨在分析您的源代码并标记可能不会导致语法错误,但在运行时可能引起问题的潜在问题。这些问题包括可疑的构造,例如不可达代码、未使用的变量以及 goroutine 相关的常见错误。通过在开发过程早期捕获这些问题,go vet 有助于提高代码质量、减少调试时间并增强整体软件的可靠性。要为指定项目运行 go vet,请执行:
go vet ./...
订阅 golang-announce 以获取安全发布通知
包含安全修复的 Go 版本将预先通知低流量邮件列表 golang-announce@googlegroups.com。如果您想知道 Go 本身的安全修复何时到来,请订阅。