笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 引擎骨架

    • UE 引擎(客户端—服务器交互)
    • 引擎架构与一帧的时序
    • UObject / GC / 反射
    • Gameplay Framework 与端存在性矩阵
  • 复制栈底层

    • NetDriver / Channel / Bunch
    • 属性复制
    • RPC
  • 带宽与规模

    • Relevancy 与带宽预算
    • UE5 Iris 复制系统
  • 局内同步

    • 移动预测与回滚
    • 延迟补偿
    • 网络物理同步
  • 系统与运维

    • GAS 网络模型
    • 专用服务器 · Session · Travel
    • 服务器权威与反作弊

服务器权威与反作弊(引擎内)

前面每一篇都在重复一句话:客户端不可信。这篇把它落成清单——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)。防这类只有两条路:

  1. 少发数据:靠 Relevancy 严格裁剪——客户端拿不到的信息就透视不出来。这是最根本的防透视手段(服务器不发 = 无法读取)。
  2. 客户端防护:让读取/篡改客户端内存变困难。

客户端防护手段与边界:

手段作用局限
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):长周期行为分析——遥测采集、异常评分(命中率/收益速率异常)、封禁与申诉闭环。引擎内判不了"这个人一周数据是否异常",局外挡不了"这一枪现在该不该中",两者互补。

最近更新: 2026/9/10 11:38
Prev
专用服务器 · Session · Travel