安全基线(草案)
本项目偏游戏服务器 SDK/运行时,默认建议把安全策略作为“可配置且可强制”的基线能力。
1) 传输加密:优先 TLS(wss://)
最佳实践:
- 生产环境优先使用
wss://(TLS)作为默认加密方案(证书校验、生态成熟、运维通用)。 - 应用层加密(
flags.ENCRYPT)作为可选能力,仅在确有需求时启用(例如某些渠道环境限制、或需要端到端额外保障)。
建议策略(可配置):
prod:requireTls=true(拒绝明文ws://)dev/local:可放开ws://便于抓包与调试,但务必限制 IP/环境
2) 鉴权与会话
- 鉴权 token 只在
Login/Resume中携带,不建议每条业务消息都携带。 - 同连接允许切号时,必须启用
sessionEpoch护栏(防异步回调串号)。 - 建议默认:同一
playerId只允许一个活跃连接(新登录踢旧连接),避免多点登录带来的状态冲突。
踢人策略(最佳实践默认):
- 默认:同
playerId新登录 踢旧连接 - 可配置:拒绝新登录(少见,仅在特殊安全策略或“同账号多端”玩法中使用)
3) 防重放与幂等
Req/Resp 重试的最佳实践:
- 客户端重试必须复用同一个
seq - 服务端对每个
PlayerSession启用seq -> response去重缓存(LRU/TTL)
对“高价值/有副作用”的业务请求(扣资源/发奖/交易):
- 仍建议业务层引入幂等键(例如订单号/事务号),防止跨会话/跨服重复。
4) 限流与 DoS 防护
协议层必须具备硬限制(可配置):
- 最大 frame bytes
- 单帧最大 TLV 个数
- 单个 TLV 的最大长度
- 每连接每秒最大请求数(尤其是未登录阶段)
- 每连接最大 in-flight 请求数(配合
ClientHelloResp.maxInFlightReq)
背压策略(最佳实践,默认):
- 当触发背压(例如:连接的 in-flight 超限、或目标分片队列已满)时:
- 拒绝当前请求并返回错误响应(
flags.ERROR+Error(code=BACKPRESSURE|SERVER_BUSY, retryable=true)) - 不建议默认断开连接(避免放大故障与用户体验抖动)
- 拒绝当前请求并返回错误响应(
建议客户端行为:
- 对
retryable=true的背压错误做指数退避重试 - 达到最大重试次数后提示“服务器繁忙”
in-flight 定义(用于背压):
- 仅统计
REQ(seq>0)且“尚未完成响应(RESP)”的请求数 - 包含已
defer的请求(即:handler 已返回但响应仍未完成) - 当服务端写出
RESP(成功或错误)后,从 in-flight 中移除
5) 敏感信息处理
- token/credential 不应被写入 access log(或必须脱敏)
- 若启用压缩:注意压缩侧信道风险(敏感字段可选择不压缩,或仅在 TLS 下压缩)