Go语言换赛道去大厂?一文带你腾讯Go语言代码安全规范

166 阅读3分钟

Tencent Code Security

#Go #代码规范 www.topgoer.cn/docs/tencen…

通用类

内存管理

* 「必须」切片长度检验
	* 判断长度合法性
* 「必须」 指针操作判断是否为nil
* 「必须」 整数安全
	* 数字运算防止(外部输入)
		* 溢出
		* 截断
	* 数组索引、对象长度、数组边界 一定要注意
* 「必须」 make分配长度验证
	* Make时用到的size参数, 先作判断, 确保不会出错
* 「必须」禁止重复释放channel
* 「必须」 确保每个协程都能退出
* 「推荐」不要用slice作为参数, 因为是引用类型

文件操作

  • 「必须」要过滤文件路径, 对于外部传入的文件名, 还要检查 ../
  • 「必须」创建文件时要合理设置文件访问权限

系统接口

  • 「必须」限定传入的命令, 进行过滤, bash、cmd、sh不允许传入, 过滤 \n, $, &, ;, |, ‘, “, (, ), ` 等潜在恶意字符

通信安全

  • 「必须」网络通信采用TLS方式
    • gRPC/ WebSocket 都不要用明文
  • 「推荐」TLS用证书验证

敏感数据保护

  • 「必须」使用配置中心系统统一托管密钥等敏感信息, 不要硬编码在程序里
  • 「必须」只输出必要的最小数据集, 减少多余字段
  • 「必须」不要在日志保存密码(无论明文还是密文)等敏感信息
  • 「必须」必须输出的敏感信息, 要进行合理的脱敏展示
  • 「必须」GET方法、注释、自动填充、缓存等方式避免泄漏敏感信息
  • 「必须」敏感数据的存储, 使用SHA2、RSA加密, 且使用独立存储层开启访问控制, 及时删除不用的临时文件和缓存
  • 「必须」合理使用panic、defer、recover, 系统异常信息不要输出到前端

加密 与 解密

  • 「必须」不得硬编码密码, 通过变换算法或者配置等方式设置密码
  • 「必须」密码存储, 如果是对称密码加密, 要保存好加密密钥. 算法设计敏感业务时, 协商使用非对称算法加密.

后台类

输入校验

  • 「必须」对于外部输入的参数, 用validator 进行白名单校验 数据长度、范围、格式

SQL操作

  • 「必须」使用database/sql的prepare、Query或GORM执行SQL操作, 禁止拼接SQL语句! 应该使用占位符 ‘?’

网络请求

  • 「必须」对参数里动态获取的变量值, 要严格安全检验

Pasted Graphic 8.png

服务器端渲染

  • 「必须」使用template时禁止将外部输入引入模版, 可以选择仅允许白名单内字符

Web跨域

  • 限定请求来源, 避免敏感信息泄漏

响应输出

  • 「必须」Response的Header的content-type必须与实际响应内容一致, 例如“application/json” 或 “text/xml”
  • 「必须」所有接口要添加安全响应头

Pasted Graphic 9.png

  • 「必须」避免外部可控的参数拼接到响应头里, 过滤‘\r’’, \n’ 或拒绝带换行符号的外部输入

  • 「必须」外部输入拼接到html页面前, 编码处理, 主要是全角标点的问题

会话管理

  • 「必须」用户登录时重新生成session, 退出登录后清理session
  • 「必须」CSRF防护, 设计敏感操作或可读敏感信息的接口要校验Referer或添加csrf——token

访问控制

  • 「必须」系统默认进行身份验证, 用白名单方式放开不需要认证的接口或页面
  • 「必须」用账号密码登录的服务需要添加验证码等二次验证
  • 「必须」涉及用户自身相关数据的操作必须验证登录用户身份及权限, 避免越权

并发保护

  1. 「必须」禁止闭包直接调用循环变量(协程用到索引时, 多协程用同一变量会数据竞争)
  2. 「必须」禁止并发写map, 容易崩溃
  3. 「必须」确保并发安全, 涉及敏感操作时, 加同步锁或原子操作来防护