Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q85: 如何防止封包伪造?

核心结论

防止封包伪造的关键,不是把协议“藏起来”,而是让服务端对每条请求都做身份、时效、顺序和业务合法性校验。

真正有效的防护通常包括:

  • 会话鉴权
  • 消息完整性保护
  • 重放和乱序控制
  • 服务端业务验证

如果最后一层没有,前面即使做了签名和加密,也仍然可能被伪造出“合法但不该成立”的请求。

一、封包伪造真正指什么

它不是单纯抓包,而是攻击者自己构造或篡改消息,让服务端误以为请求合法。

常见目标包括:

  • 非法调用未开放接口
  • 修改消息字段
  • 重放旧请求
  • 绕过客户端 UI 限制直接发业务包

二、协议私有化本身不是安全边界

自定义协议、二进制协议、混淆包头都能提高门槛,但不能作为核心防线。

因为只要客户端能正常发包,协议迟早可能被逆向出来。

真正的安全边界仍然在服务端校验。

三、会话身份必须先成立

服务端至少要知道:

  • 这条消息属于哪个会话
  • 这个会话是否仍然有效
  • 是否与当前连接绑定

否则即使消息格式正确,也无法确认发送者身份。

四、完整性和时效控制都要有

常见做法包括:

  • 消息签名或 MAC
  • 时间戳
  • 序列号
  • nonce

它们分别解决:

  • 内容是否被改
  • 消息是否过期
  • 是否重复发送

但这些都只是“传输层合法性”,还不等于“业务上合法”。

五、服务端业务验证才是真正决定结果的一层

例如客户端发来:

  • 使用技能
  • 购买物品
  • 领取奖励

服务端仍然必须校验:

  • 技能是否在冷却中
  • 购买条件是否满足
  • 奖励是否已领取过

也就是说,客户端只能提交请求意图,不能提交最终结论。

六、重放和伪造经常一起出现

一条历史合法请求被重新发送,本质上也是一种伪造利用。

所以封包伪造防护通常要和:

  • 重放攻击防护
  • 幂等设计

一起看,而不是拆开孤立处理。

七、工程上更稳妥的组合

常见做法是:

  • 会话级鉴权
  • 消息级完整性保护
  • 序列号或 nonce 防重放
  • 服务端按业务规则再次校验

这样即使协议被逆向,攻击者也很难直接伪造出有效高价值请求。

八、常见误区

1. 自定义二进制协议就能防伪造

不能。只能提高逆向门槛。

2. 用 TLS 之后就不用做消息校验

TLS 保护通道,不替代业务合法性校验和幂等。

3. 只要签名正确,请求就该执行

不对。签名只说明“这条消息没被篡改”,不说明“这条业务现在应该成立”。

参考资料

  • 会话鉴权、消息签名和业务幂等实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu