服务器权威与反作弊(引擎内)
前面每一篇都在重复一句话:客户端不可信。这篇把它落成清单——UE 里哪些计算必须在服务器、哪些可以放客户端、移动/射击/经济各自怎么校验、以及 EAC/BattlEye 这类客户端防护能做什么不能做什么。
一句话结论
只信客户端的「输入意图」,一切结果由服务器算;移动查速度与时间戳、射击查起点视线射速、经济查幂等与库存。
与局外反作弊的分工
本篇讲引擎内的权威校验(一局之内:移动合法吗、这枪打得中吗、这次消耗算不算)。局外的遥测、异常评分、封禁与申诉闭环见 游戏反作弊。两者互补:引擎内挡实时非法操作,局外做长周期行为分析与处置。
场景问题
打个比方:客户端像顾客手写的小票。顾客说「这单我买了 3 件、总价 0 元、已结清」——你敢直接入账吗?不敢,小票是他自己写的。正确姿势是:只接受「我要买什么」这个意图,价格、库存、余额一律收银台自己查自己算。
校验也是这个路子,全是拿常识核对:他说自己一秒走了 50 米,那超出了人腿的物理上限(速度校验);他说这一枪从 200 米外的墙里射出,可服务器记录他人在门口(起点贴合);他说刚才那一秒开了 30 枪,可枪的射速做不到(射速校验);他报的时间戳一会儿往前一会儿往后,那就是在谎报走过多少时间(时间戳单调性)。
但有一类作弊这么防不住:透视。因为他没伪造任何小票——只是把你已经交到他手上的资料多看了几眼。你的客户端为了把敌人画出来,必须知道敌人在哪。所以防透视只有两条路:根本别把这份资料给他(Relevancy 裁剪,最根本),或者让他很难翻自己口袋(EAC/BattlEye 这类客户端防护)。后者像给资料加个锁扣——抬高成本,撬不开是运气,撬开是时间问题。
一句话地基:账我自己算(服务器权威),不该给的资料我不发(少发数据)。客户端防护是锁扣,不是地基。
「客户端发来一个 ServerFire(命中了玩家B, 伤害100),你敢直接结算吗?」——不敢。客户端进程在玩家机器上,内存可改、包可伪造、代码可逆向。任何「客户端算好结果、服务器照办」的设计都是作弊入口。但也不能什么都服务器算(那就没手感了)。所以关键是划清权威边界:哪些必须服务器算、哪些可预测但需确认、哪些纯本地无所谓。
实现方案
1. 权威边界清单
| 类别 | 例子 | 规则 |
|---|---|---|
| 必须服务器算 | 伤害结算、死亡判定、金币/道具增减、掉落随机、命中判定、CD 与资源消耗 | 客户端只发意图,结果一律服务器计算并复制回来 |
| 可预测但需服务器确认 | 角色移动、技能激活表现、动画播放 | 客户端本地先演(手感),服务器复算/确认,错了回滚(见 移动预测、GAS 网络) |
| 纯客户端即可 | UI、准星、音效、装饰粒子、镜头 | 不影响 gameplay,本地算不同步 |
判断口诀:这件事的结果影响胜负或经济吗?影响 → 服务器算。
2. 移动校验
客户端上报 ServerMove(见 移动预测),服务器要校验:
- 速度/加速度上限:复算得到的位移是否超过该角色在该状态下的物理可能上限(防加速外挂)。
- 时间戳单调性与总时长核对:
ServerMove带客户端时间戳。校验它单调递增、增量在合理范围、且累计时长不显著超过服务器实际经过的时间——防「时间加速」(客户端谎报走了更多时间从而合法地移动更远)。 - 传送阈值:单步位移超过阈值直接拒绝并强制纠正(防瞬移)。
- 可达性:位置是否在可行走区域内(防穿墙/飞行)。
3. 射击校验
收到客户端开火上报时:
- 起点贴合:上报的射击起点必须贴近服务器认为的角色位置/枪口(防远程凭空开枪)。
- 射速与弹药:与服务器记录的上次开火时间、剩余弹药核对(防连发/无限弹药)。
- 视线复核:服务器自己做射线检测确认目标可见、无遮挡——不信客户端说的「打中了」。
- 回溯窗口约束:用了 延迟补偿 的回溯时,校验客户端时间戳在允许窗口内(防回溯到远古历史)。
4. 经济校验
- 一切增减服务器算:客户端只能发「我要买这个」,价格、余额、库存全服务器查。
_Validate挡边界:数量、ID 合法性(见 RPC)。- 幂等:重复上报/重放同一请求不能重复扣减或重复发奖——这套设计见 业务幂等性设计。
5. 客户端防护与它的局限
服务器权威挡不住一类作弊:信息类外挂(透视、雷达)——因为它不改变客户端发给服务器的任何东西,只是读取客户端已有的数据。你的客户端为了渲染,必须知道相关敌人的位置(见 Relevancy)。防这类只有两条路:
- 少发数据:靠 Relevancy 严格裁剪——客户端拿不到的信息就透视不出来。这是最根本的防透视手段(服务器不发 = 无法读取)。
- 客户端防护:让读取/篡改客户端内存变困难。
客户端防护手段与边界:
| 手段 | 作用 | 局限 |
|---|---|---|
| Pak 加密 / 签名 | 防资产篡改(改模型做透视墙)、防资源提取 | 密钥在客户端,投入足够可提取 |
| Shipping 构建裁剪 | 去掉调试符号、控制台命令、编辑器功能 | 只是抬高门槛 |
| EAC / BattlEye | 内核级/进程级检测已知外挂、内存篡改、注入、调试器 | 军备竞赛,永远滞后于新外挂;不能防硬件级作弊(外接设备、DMA) |
核心原则:客户端防护只能抬高作弊成本,不能根除。真正的安全基线是「服务器权威 + 少发数据」——服务器算的结果客户端改不了,服务器没发的数据客户端读不到。客户端防护是锦上添花,不是地基。局外的行为分析与封禁处置见 游戏反作弊。
6. 一句话记住三类作弊的差别
三类作弊的防法完全不同,混在一起讲就答不清:
| 类别 | 例子 | 一句话 | 防法 |
|---|---|---|---|
| 伪造类 | 改伤害、无限弹药、瞬移 | 他伪造了发给服务器的小票 | 服务器权威 + 复算校验,能根治 |
| 信息类 | 透视、雷达 | 他没伪造任何东西,只是多看了你给他的资料 | Relevancy 少发数据(根本)+ 客户端防护(抬成本) |
| 操作类 | 自瞄、宏、连点 | 小票和资料都合法,是「手」不是人 | 只能行为统计 + 局外风控(见 游戏反作弊),引擎内挡不住 |
关键结论:只有伪造类能靠引擎内校验根治。信息类的上限是「少发」,操作类的上限是「事后识别」。面试里把这三类分开说,比笼统喊「服务器权威」有说服力得多。
为什么这么做
只信输入意图:输入意图(「我按了 W」「我要开枪」)是玩家唯一合法能提供的东西,且伪造它的收益有限(相当于按键更快,可被射速/速度上限约束)。而结果(伤害、命中、余额)一旦交给客户端,就是无约束的作弊。
分层校验(廉价先行):_Validate 做廉价边界检查、复算做物理合法性、遥测做长周期统计。越廉价的检查放越前面,让明显的作弊在最便宜的地方被挡掉。
Relevancy 兼做防透视:这是「安全靠架构而非补丁」的典型——把不该给的数据从根上不发,比事后检测外挂可靠得多。
为什么别的选择不行
- 信客户端的命中/伤害:aimbot、一击必杀、无限伤害全放行,竞技游戏直接死。
- 只靠 EAC 不做服务器校验:EAC 是黑名单式检测,永远滞后于新外挂;服务器校验是白名单式(不合法就不生效),才是地基。
- 什么都服务器算不做预测:每个操作都要等 RTT,手感崩,玩家跑光。
- 靠客户端加密防透视:客户端为渲染必须持有数据,密钥也在客户端,加密只是延缓。根本解法是 Relevancy 不发。
- 只做引擎内校验不做局外分析:引擎内只能判「这一次操作合法吗」,判不了「这个人一周的命中率是否异常」。需要局外遥测配合,见 游戏反作弊。
沉淀结论
只信输入意图,结果全服务器算。三类边界:必须服务器算(伤害/经济/命中/随机)、可预测需确认(移动/技能表现)、纯本地(UI/特效)。校验:移动查速度上限+时间戳单调性+传送阈值;射击查起点贴合+射速弹药+服务器自己射线复核;经济查 _Validate+幂等。防透视靠 Relevancy 少发数据(架构层),EAC/Pak 加密只抬高成本不能根除。局外遥测封禁见 game-biz/anti-cheat。
记忆口诀
总则:只信输入意图 / 结果服务器算 / 影响胜负或经济就必须服务器
三边界:必服务器(伤害·经济·命中·随机) / 可预测需确认(移动·技能表现) / 纯本地(UI·特效·音效)
移动校验:速度加速度上限 / 时间戳单调+总时长核对(防加速) / 传送阈值 / 可达性
射击校验:起点贴合 / 射速弹药核对 / 服务器自己射线复核 / 回溯窗口约束
经济校验:_Validate 边界 / 服务器查价格余额库存 / 幂等防重放
防透视:Relevancy 少发数据是根本 / EAC·Pak 加密只抬高成本
内容来源
综合整理。主要参考:Epic 官方文档 Networking Overview(服务器权威原则)、Anti-Cheat(EAC 集成)、UE 源码 CharacterMovementComponent 的客户端错误校验路径、业界竞技 FPS 反作弊公开分享。
相关专题:局外遥测/异常评分/封禁申诉见 游戏反作弊;移动校验依赖的预测闭环见 移动预测与回滚;回溯窗口约束见 延迟补偿;RPC 参数校验见 RPC;防透视的数据裁剪见 Relevancy 与带宽预算;经济幂等见 业务幂等性设计。
自测:合上资料能说清楚吗?
哪些计算必须在服务器?怎么判断?
参考答案
判断口诀:结果是否影响胜负或经济。必须服务器算:伤害结算、死亡判定、金币/道具增减、掉落随机、命中判定、CD 与资源消耗。可预测但需服务器确认:移动、技能激活表现、动画(客户端先演保手感,服务器复算/确认,错了回滚)。纯客户端:UI、准星、音效、装饰粒子。总则是只信客户端的「输入意图」,一切结果服务器算。
怎么防加速外挂?
参考答案
移动上报(ServerMove)带客户端时间戳,服务器校验:① 时间戳单调递增、增量在合理范围;② 累计时长不显著超过服务器实际经过的时间(防谎报走了更多时间从而"合法地"移动更远);③ 复算位移不超过该角色该状态下的速度/加速度物理上限;④ 单步位移超阈值直接拒绝并纠正(防瞬移)。
为什么服务器权威挡不住透视?根本解法是什么?
参考答案
透视不改变客户端发给服务器的任何数据,只是读取客户端为渲染而必须持有的信息(相关敌人位置)——服务器权威管的是"结果谁算",管不了"客户端已有数据被读取"。根本解法是Relevancy 严格裁剪,少发数据:服务器不发的信息客户端读不到(架构层解决)。EAC/BattlEye、Pak 加密只能抬高成本、是黑名单式滞后手段,不能根除。
引擎内反作弊和局外反作弊怎么分工?
参考答案
引擎内(本篇):一局之内的实时权威校验——移动合法性、命中判定、资源消耗,不合法就当场不生效。局外(game-biz/anti-cheat):长周期行为分析——遥测采集、异常评分(命中率/收益速率异常)、封禁与申诉闭环。引擎内判不了"这个人一周数据是否异常",局外挡不了"这一枪现在该不该中",两者互补。