当前位置: 首页 > news >正文

保障 Golang 项目安全的最佳实践

对任何项目来说,安全都是一个永恒的话题,本文详细讲解一下保障 Golang 项目的安全性需要遵循一些最佳实践。

对源代码和构建出的二进制文件做全面的安全扫描

定期对源代码和二进制文件进行全面的安全扫描,查找漏洞,以便及早识别出潜在的安全漏洞并进行修复。

可以使用由 Go 漏洞数据库支持的 govulncheck 工具来扫描出代码中的安全漏洞,并分析哪些漏洞会真正有安全隐患。govulncheck 还可以集成到 CI/CD 流水线中,Go团队在 GitHub Marketplace 上为 govulncheck 提供了一个 GitHub Action。govulncheck 还支持 -json 标志,以帮助开发人员将漏洞扫描与其他 CI/CD 系统集成在一起。

也可以结合使用其他静态代码扫描工具,在开发过程中发现可能导致安全漏洞的设计和代码编写错误,来提高代码的质量和安全性。

确保使用最新的 Golang 版本和相关依赖的最新版本

使用最新的 Golang 版本会有以下好处:

  • 可以使用到语言的新特性,新版本的 Go 语言会提供新的语言特性、库和工具,可以帮助更高效地编写代码。
  • 性能提升,新版本的 Go 语言通常会包含性能优化和改进,可以帮助提高程序性能。
  • 安全漏洞修复,新版本的 Go 语言通常会包含安全修复,可以帮助保护代码免受老版本安全漏洞的影响。
  • 更好的兼容性,Go 语言遵循向后兼容性原则,也就是新版本的 Go 语言可以运行旧版本的代码。然而,一些过时和不推荐使用的特性可能在新版本中被移除,因此使用新版本可以确保代码不依赖于这些过时的特性。

升级 Go 版本时,要注意测试代码的兼容性(包括依赖的三方库)并做好代码审核,确保平稳升级到新版本。

使用用模糊测试来发现边界问题

模糊测试是通过数据构造引擎自动构造出(也可以借助开发者提供的初始数据)大量随机数据,作为程序的输入来进行测试的一种方式。模糊测试会监测程序运行过程中是否出现 panic、断言失败、无限循环等异常情况,特别是容易被忽视的边界情况。

之前有写过一篇文章专门讲解 Golang 中的模糊测试,请参考《一文掌握 Golang 模糊测试(Fuzz Testing)》。

使用 Race Detector 检测竞态条件

并发编程可以提高程序的性能和稳定性,但也带来了一些挑战,如竞态条件。竞态条件是指并发程序中的多个线程同时访问共享资源,导致程序行为不确定的问题。为了避免竞态条件的产生,需要使用同步机制(如互斥锁、条件变量等)来协调线程之间的访问。然而,在复杂的程序中,竞态条件可能难以察觉,因此 Golang 提供了竞态条件检测工具 Race Detector。

race detector 集成在了 golang 的工具链中,当设置了 -race 标志位时,编译器会使用代码记录所有的内存访问,包括访问内存的时间和方式,而运行时库则监控对共享变量的不同步访问情况。当检测到这种竞态行为时,将会打印警告信息。

之前有写过一篇文章专门讲解 Golang 中的 Race Detector,请参考《Go 工具链详解(五):竞态条件检测神器 Race Detector》。

使用 vet 工具检查潜在的错误

go vet 是一个非常有用的工具,可以帮助开发者在早期阶段发现代码中的问题,这些问题不一定是语法错误,但可能在运行时导致错误。例如无法访问的代码、未使用的变量以及与程序程有关的常见错误。通过在开发过程的早期捕获这些问题,go vet 可以帮助提高代码质量,减少调试时间,并增强整程序的可靠性。

之前有写过一篇文章专门讲解 Golang 中的代码扫描的文章,请参考《赶快使用这些静态扫描工具提高你的 Golang 代码质量!》。

订阅 golang-announce 来及时获得安全版本的通知

包含安全修复的 Go 版本会预先发布到小批量邮件列表 golang-announce@googlegroups.com。如果想知道 Go 安全修复程序何时发布,可以订阅下。

小结

本文介绍的是 Golang 官方推荐的安全实践,在实践过程中,也可以在这个基础上加入更多的安全实践。

http://www.lryc.cn/news/210269.html

相关文章:

  • PG物理备份与恢复之pg_basebackup
  • npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  • Android 13.0 通过驱动实现禁用usb鼠标和usb键盘功能
  • Ubuntu 22.04配置/etc/rc.local开机自启文件
  • python爬虫之正则表达式解析实战
  • 什么是虚拟dom?
  • 大数据学习(18)-任务并行度优化
  • C++学习笔记之四(标准库、标准模板库、vector类)
  • IDEA部署SSM项目mysql数据库MAVEN项目部署教程
  • uniapp 将流转化为视频并播放 微信小程序
  • 【软考】系统集成项目管理工程师(十)项目质量管理【3分】
  • 七层负载均衡 HAproxy
  • SQL SELECT TOP, LIMIT, ROWNUM
  • vue3-admin-element框架登录如何修改?
  • 基于mysql的请假系统,java/springboot/jsp/javaweb/tomcat
  • 【Python机器学习】零基础掌握partial_dependence检验、检查
  • 前端Vue页面中如何展示本地图片
  • 基于PHP的图像分享社交平台
  • 【算法|动态规划No.31 | 01背包问题】01背包模板题
  • Azure - 机器学习:使用 Apache Spark 进行交互式数据整理
  • 4.5 final修饰符
  • Clickhouse数据库部署、Python3压测实践
  • 探索控制领域:从电视遥控器到自动驾驶【基础概念理解、应用实例】
  • 在R中安装CmdStanR的步骤-R4.3.1-CmdStanR-0.6.1.900
  • 安信可小安派AiPi 代码下载
  • 程序化交易(二)level2行情数据源接入
  • 4.6 static修饰符
  • C++头文件定义变量
  • [蓝桥杯-610]分数
  • Vue指令大全:深入探索Vue提供的强大指令功能