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语句! 应该使用占位符 ‘?’
网络请求
- 「必须」对参数里动态获取的变量值, 要严格安全检验
服务器端渲染
- 「必须」使用template时禁止将外部输入引入模版, 可以选择仅允许白名单内字符
Web跨域
- 限定请求来源, 避免敏感信息泄漏
响应输出
- 「必须」Response的Header的content-type必须与实际响应内容一致, 例如“application/json” 或 “text/xml”
- 「必须」所有接口要添加安全响应头
-
「必须」避免外部可控的参数拼接到响应头里, 过滤‘\r’’, \n’ 或拒绝带换行符号的外部输入
-
「必须」外部输入拼接到html页面前, 编码处理, 主要是全角标点的问题
会话管理
- 「必须」用户登录时重新生成session, 退出登录后清理session
- 「必须」CSRF防护, 设计敏感操作或可读敏感信息的接口要校验Referer或添加csrf——token
访问控制
- 「必须」系统默认进行身份验证, 用白名单方式放开不需要认证的接口或页面
- 「必须」用账号密码登录的服务需要添加验证码等二次验证
- 「必须」涉及用户自身相关数据的操作必须验证登录用户身份及权限, 避免越权
并发保护
- 「必须」禁止闭包直接调用循环变量(协程用到索引时, 多协程用同一变量会数据竞争)
- 「必须」禁止并发写map, 容易崩溃
- 「必须」确保并发安全, 涉及敏感操作时, 加同步锁或原子操作来防护