出于好奇,我一直在从事UDP网络项目的工作,但遇到一个我无法解决的问题。我已经研究并了解以下基本原理:
我对UDP的大部分了解来自以下精彩的文章:https://gafferongames.com/ ;而且我很幸运地使用了这个library,它基于作者自己的UDP协议,并负责大多数权威性保护。
现在,这是我的问题:
使用完全权威的服务器,玩家似乎仍然可以作弊。
例如:
对于格斗游戏,客户端具有两个功能。 void hit()
和void hurt
,这是允许客户刺激战斗的基本功能。
在方案1中:localPlayer命中另一个播放器,并将其发送到服务器。然后,服务器将被发送的数据包发送到播放器的客户端,这将触发hurt()
函数。但是,如果播放器编辑了文件并删除了伤害功能,则什么也不会发生。删除了hurt()
功能的播放器将是无敌的。
在方案2中:localPlayer被其他播放器击中并调用hurt()
,并将其发送到服务器。然后,服务器将一个数据包发送给打到localPlayer的播放器的客户端,这将触发hit()
函数。但是,如果localPlayer编辑了文件并删除了hurt()
函数,将不会发生任何事情。删除了hurt()
功能的玩家将再次立于不败之地。
我只能想到两种解决方案:
如果游戏遇到错误(由于删除了一个功能而该功能不存在),则将客户端与服务器断开连接。(不是很好)
我在编写此代码时刚刚想到的一个问题,可能是我的解决方案:在服务器上为每个玩家存储一个健康变量,如果该变量为0,则忽略游戏可能无法获得的任何数据包没有被编辑。
第二种解决方案现在对我来说听起来不错,但是由于我是个初学者,我对你们会做什么/会做什么感到很好奇。很高兴听到任何建议,谢谢!
答案 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,否则脚本通常不会提供游戏突破性优势)
但这确实归结为金钱支出与黑客对游戏造成的损害之间的权衡