防止多人游戏作弊的方法有哪些?

3
我出于好奇一直在做一个UDP网络项目,但遇到了一个难以理解的问题。我已经研究并理解了基本原则,例如:

  1. 使用权威服务器,让客户端尽可能少地拥有权限。
  2. 确保每个客户端都通过自己的加密密钥与服务器唯一标识。
  3. 通过增加响应数据包的大小来防止DDOS攻击。
  4. 等等。

我对UDP的大部分了解来自这些精彩的文章:https://gafferongames.com/;而且我很幸运地正在使用这个, 它基于作者自己的UDP协议,并处理了大部分权威保护。

现在,我的问题是:

即使使用完全权威的服务器,玩家似乎仍然可以作弊。

例如: 对于一个格斗游戏,客户端有两个函数。 void hit()void hurt(),这些是允许客户端刺激战斗的基本功能。
情景1:本地玩家击中另一个玩家,并将其发送到服务器。然后服务器会向被击中的玩家的客户端发送数据包,触发hurt()函数。但是如果玩家编辑了文件并删除了hurt()函数,则什么也不会发生。删除了hurt()函数的玩家将变得无敌。
情景2:本地玩家被另一个玩家击中,并调用hurt(),并将其发送到服务器。然后服务器会向击中本地玩家的玩家的客户端发送数据包,触发hit()函数。但是如果本地玩家编辑了文件并删除了hurt()函数,则什么也不会发生。删除了hurt()函数的玩家将再次变得无敌。
我只能想到两种解决方案:
  1. 如果游戏遇到错误(因为函数被删除而不存在),则将客户端从服务器断开连接。(不是很好)

  2. 我在写这篇文章时刚想到的另一种解决方案:在服务器上为每个玩家存储一个健康变量,如果达到0,则忽略任何数据包,这些数据包在未编辑游戏时是不可能的。

我现在觉得第二种解决方案听起来不错,但我很想知道你们都做了/会做什么,因为我是个新手。非常感谢任何建议!

3个回答

4
删除了hurt()函数的玩家将变得无敌。但如果服务器计算出游戏状态的“主控版本”,那么修改代码的玩家只会在其客户端上看到无效的游戏状态,这对他们玩游戏没有帮助。总体而言,除了玩家输入之外,所有操作都必须由服务器完成,客户端只是告诉服务器玩家做了什么,每个结果性的动作或更改都由服务器执行。这样,玩家就不能改变任何东西,除了他们想做的事情,这已经在他们的管辖范围内了。请注意,玩家仍然可以通过工具作弊,例如自动点击器或瞄准辅助软件。这些作弊形式更难处理,因为很难判断某个人是否正在获得超人类的帮助,或者他们只是一个优秀的玩家。

对于“主要副本”,这是否是一个完整的Unity游戏模拟,包括物理等?还是我的简单解决方案足以处理每个玩家的健康状况?此外,您认为我最好选择预先构建的反作弊系统吗?我注意到这似乎是许多公司解决问题的方式。如果一家公司都不能费心制作自己的反作弊功能,我就更不可能了哈哈。 - Buretto
“主副本” 包含了游戏的整个“状态”-- 所有事物的位置、生命值、物理学的当前状态等。基本上,一切你需要知道游戏中正在发生什么的东西都在其中。客户端有权请求行动(例如,在这个方向射出子弹),但是行动对状态的影响由服务器计算并广播给客户端以供显示。 - k_ssb
如果所有内容都由服务器进行身份验证,那么有什么方法可以促进平稳的移动呢?我想可以使用客户端预测,然后如果玩家与服务器状态相差太远,则会重新定位。但这会导致很多橡皮筋效应(我注意到撞到碰撞器有时会弄乱事情)。你知道游戏是如何解决这个问题的吗? - Buretto
@Bureto 这是完全不同的问题,所以你应该单独提出来问。我们尽量让每个问题尽可能专注。 - k_ssb

2

客户端不应该决定是否击中另一个玩家,这应该由服务器完成。

客户端可以说,“我向这个方向射出了一颗子弹”,然后根据游戏状态,由服务器决定是否命中。当然,根据游戏类型,客户端可能需要进行一些预测 :)


我的游戏使用Unity中的人形化身和Mecanim 3D动画。我发现客户端预测对于运动的流畅性是必须的。但是,你所说的是指在服务器上进行完整的Unity模拟,以供客户端参考吗?我认为这会解决我很多问题,但我不确定我的服务器是否能够处理它。我正在使用AWS的免费版,你觉得可以吗? - Buretto

2
您所描述的是典型的客户端信任模型。服务器信任客户端所说的内容。
为了完全防止黑客攻击,需要采用服务器信任模型。基本上,客户端将发送所需的操作到服务器,服务器有最终决定该操作是否合法的权利。
要破解它,客户端A可以编辑命中包以修改伤害量或不断发送命中包。
总之,只要在服务器端模拟和计算的内容就不会被黑客攻击,除非他们入侵你的服务器。如果您模拟HP + 技能伤害,则无法使用上帝模式。如果您进行服务器端物理学,则无法进行速度攻击。如果您模拟并验证所有内容,则不可能发生任何黑客攻击。但这实际上取决于投资与黑客攻击对游戏造成的损害之间的权衡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接