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