Q85: 如何防止封包伪造?
核心结论
防止封包伪造的关键,不是把协议“藏起来”,而是让服务端对每条请求都做身份、时效、顺序和业务合法性校验。
真正有效的防护通常包括:
- 会话鉴权
- 消息完整性保护
- 重放和乱序控制
- 服务端业务验证
如果最后一层没有,前面即使做了签名和加密,也仍然可能被伪造出“合法但不该成立”的请求。
一、封包伪造真正指什么
它不是单纯抓包,而是攻击者自己构造或篡改消息,让服务端误以为请求合法。
常见目标包括:
- 非法调用未开放接口
- 修改消息字段
- 重放旧请求
- 绕过客户端 UI 限制直接发业务包
二、协议私有化本身不是安全边界
自定义协议、二进制协议、混淆包头都能提高门槛,但不能作为核心防线。
因为只要客户端能正常发包,协议迟早可能被逆向出来。
真正的安全边界仍然在服务端校验。
三、会话身份必须先成立
服务端至少要知道:
- 这条消息属于哪个会话
- 这个会话是否仍然有效
- 是否与当前连接绑定
否则即使消息格式正确,也无法确认发送者身份。
四、完整性和时效控制都要有
常见做法包括:
- 消息签名或 MAC
- 时间戳
- 序列号
- nonce
它们分别解决:
- 内容是否被改
- 消息是否过期
- 是否重复发送
但这些都只是“传输层合法性”,还不等于“业务上合法”。
五、服务端业务验证才是真正决定结果的一层
例如客户端发来:
- 使用技能
- 购买物品
- 领取奖励
服务端仍然必须校验:
- 技能是否在冷却中
- 购买条件是否满足
- 奖励是否已领取过
也就是说,客户端只能提交请求意图,不能提交最终结论。
六、重放和伪造经常一起出现
一条历史合法请求被重新发送,本质上也是一种伪造利用。
所以封包伪造防护通常要和:
- 重放攻击防护
- 幂等设计
一起看,而不是拆开孤立处理。
七、工程上更稳妥的组合
常见做法是:
- 会话级鉴权
- 消息级完整性保护
- 序列号或 nonce 防重放
- 服务端按业务规则再次校验
这样即使协议被逆向,攻击者也很难直接伪造出有效高价值请求。
八、常见误区
1. 自定义二进制协议就能防伪造
不能。只能提高逆向门槛。
2. 用 TLS 之后就不用做消息校验
TLS 保护通道,不替代业务合法性校验和幂等。
3. 只要签名正确,请求就该执行
不对。签名只说明“这条消息没被篡改”,不说明“这条业务现在应该成立”。
参考资料
- 会话鉴权、消息签名和业务幂等实践资料
