可以采取什么措施来防止多人入侵?

时间:2018-06-21 17:15:05

标签: c# unity3d

出于好奇,我一直在从事UDP网络项目的工作,但遇到一个我无法解决的问题。我已经研究并了解以下基本原理:

  1. 使用权威服务器,并赋予客户端尽可能少的权限。
  2. 确保服务器使用其自己的加密密钥唯一标识每个客户端。
  3. 通过夸大响应包来阻止DDOS攻击。
  4. 等。

我对UDP的大部分了解来自以下精彩的文章:https://gafferongames.com/ ;而且我很幸运地使用了这个library,它基于作者自己的UDP协议,并负责大多数权威性保护。

现在,这是我的问题:

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

  • 例如:

    对于格斗游戏,客户端具有两个功能。 void hit()void hurt,这是允许客户刺激战斗的基本功能。

    在方案1中:localPlayer命中另一个播放器,并将其发送到服务器。然后,服务器将被发送的数据包发送到播放器的客户端,这将触发hurt()函数。但是,如果播放器编辑了文件并删除了伤害功能,则什么也不会发生。删除了hurt()功能的播放器将是无敌的。

    在方案2中:localPlayer被其他播放器击中并调用hurt(),并将其发送到服务器。然后,服务器将一个数据包发送给打到localPlayer的播放器的客户端,这将触发hit()函数。但是,如果localPlayer编辑了文件并删除了hurt()函数,将不会发生任何事情。删除了hurt()功能的玩家将再次立于不败之地。

我只能想到两种解决方案:

  1. 如果游戏遇到错误(由于删除了一个功能而该功能不存在),则将客户端与服务器断开连接。(不是很好)

  2. 我在编写此代码时刚刚想到的一个问题,可能是我的解决方案:在服务器上为每个玩家存储一个健康变量,如果该变量为0,则忽略游戏可能无法获得的任何数据包没有被编辑。

第二种解决方案现在对我来说听起来不错,但是由于我是个初学者,我对你们会做什么/会做什么感到很好奇。很高兴听到任何建议,谢谢!

3 个答案:

答案 0 :(得分:1)

  

删除了hurt()功能的播放器将是无敌的。

如果服务器计算出游戏状态的“主副本”,则不会。在这种情况下,修改代码的玩家只会让其客户端显示无效的游戏状态,这不会帮助他们玩。

通常,玩家输入以外的所有内容都必须由服务器完成,客户端只会说出玩家选择做什么,并且所有由此产生的动作/更改均由服务器执行服务器。这样,玩家除了自己想做的事以外就无法更改其他任何东西,这已经在他们的管辖范围内。

请注意,玩家仍然可以借助自动点击器或瞄准机器人等工具作弊。这些作弊形式很难处理,因为很难分辨某人是在接受非人道援助还是只是一个好球员。

答案 1 :(得分:1)

客户端不应决定是否击中其他玩家,服务器应该这样做。

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

答案 2 :(得分:1)

您所描述的是典型的客户信任模型。服务器信任客户端告诉的内容。

要完全防止黑客入侵,需要服务器信任模型。基本上,客户端将向服务器发送所需的操作,服务器拥有决定该操作是否合法的最终权利。

  

客户信任示例:
  1.客户A击中客户B
  2.客户端A将匹配包发送到服务器
  3.服务器收到命中包并将其广播给所有人
  4.客户B收到包裹并打电话伤了

要对其进行黑客攻击,客户端A可以编辑命中包以修改损坏金额或继续发送命中包

  

服务器信任示例:
  1.客户A的二手技能1
  2.客户端A将技能1包发送到服务器
  3.服务器从客户端A接收到技能1包
  4.服务器验证A的技能1 CD可用并授予操作。通过授予动作服务器,确定B将被命中,因此   广播(A技能1,B被命中,B的新HP为xxx)
  5.客户收到广播并修改用户界面

尝试失败1:A尝试在技能1无法使用时施放技能1,而服务器立即拒绝该技能。
破解尝试2:A尝试使用程序包伤害B,但除了可以采取的行动(例如移动,技巧,攻击等)外,他什么也不能发送
入侵尝试3:A想要修改损害,但由于损害是在服务器上计算的,因此他无法修改

基本上,您在服务器端进行模拟和计算的任何内容都不会被黑客入侵,除非他们入侵了您的服务器。

因此,如果您模拟HP +技能伤害,则不可能使用上帝模式。如果您进行服务器端物理操作,则无法进行速度破解。如果您模拟并验证所有内容,则不可能被黑客入侵。 (我不将脚本(bot)归为hack,因为除非您使用Foot bot制作FPS游戏和ppl,否则脚本通常不会提供游戏突破性优势)

但这确实归结为金钱支出与黑客对游戏造成的损害之间的权衡