4

你见过什么样的新手错误,有什么解决方法?

一次又一次发生的一个是客户端没有针对服务器进行任何检查。

例如:

  • 用户反编译 Flash 游戏源或监听网络流量,查看高分数据的去向,并发送虚假的高分,甚至不玩游戏。
  • 用户使用培训师并获得甚至可能不会出现在当前级别的项目。这发送到服务器,如“客户端 X 得到项目 Y”,服务器只是接受。

简单的解决方法当然是将游戏客户端仅作为服务器的 API 处理。然后用户可以使用他们喜欢的训练器和其他内存操作,但服务器只是说你不能这样做。将服务器视为数据库,您可以在其中查询带有游戏规则的事物。

例如

  • 客户端:开始游戏
  • 客户端:连接到服务器
  • 客户端:从服务器查询可用金额
  • 用户:启用将钱设置为无限的培训师
  • 客户端:server.buyItem('非常昂贵')
  • 服务器:检查游戏状态(用户现在可以购买东西)。检查 player[0].money -> 没有奖金。
  • 客户端:server.buyItem('可以得到这个')
  • 服务器:检查游戏状态(用户现在可以购买东西)。检查 player[0].money,好的。player[0].items.add('can get this') 这将减少来自 player[0].money 的成本。然后通知客户端 send(player[0], 'items', 'can get this'); 发送(玩家[0],'钱',玩家[0].money)。

另一种方法是记录客户端的动作并将其发送到服务器播放它的高分服务器。当然,这会导致该记录非常大。

4

3 回答 3

6

毫无疑问,是对客户的盲目信任。在我正在开发的游戏中,我们现在将所有“业务逻辑”保留在服务器端,并且让客户端机器只向我们发送它们正在执行的命令;例如“玩家 B 想要向右移动”——但服务器会计算他们向右移动了多远。这会产生性能开销(当然还有滞后问题,可以更好地处理),因此可能的中间立场是在客户端进行繁重的计算,并且仍然在服务器上进行检查;例如,检查客户端的播放器在更新之间的移动时间是否超出预期;即,如果最大播放器速度为 200 个单位/秒,如果您在 0.5 秒后收到更新说他们移动了 150 个单位,请启动它们。

当然,这并不一定会阻止某人编写机器人来发送这些按键,因此还有其他方法可以防止这种情况发生。尽管如此,根本没有验证在很大程度上是一个新手错误(当我走捷径时,我承认我是有罪的)

于 2009-03-06T00:37:51.113 回答
6

Valve 采取的方法(至少在某一时刻)是让客户端和服务器独立地模拟游戏。然后服务器进行权威模拟并向所有客户端发送状态更新以纠正他们的错误/黑客攻击。

例如,如果您按向左箭头,您的角色将立即向左移动;无需等待服务器说“OK”。但是,如果事实证明你已经把自己穿过了一堵墙,下一次服务器更新会让你出现在墙旁边,因为服务器认为它是坚固的。

类似地,如果客户端看到一个角色向前移动,它会假设它会继续向前移动,直到服务器返回一个权威响应。

这种方法在服务器做出主要决策(并在模拟过程中执行健全性检查)时击败了黑客尝试,并且还处理了客户端在从服务器获得消息之前做出预测时的延迟。

另一个与“信任客户端”相关的大错误是认为您的网络协议不能被伪造。人们倾向于假设,如果他们向服务器发送二进制块,这些二进制块将永远不会被逆向工程,并且没有人会试图弄乱数据以查看会发生什么。这导致了各种各样的问题。

于 2009-03-06T02:37:32.760 回答
1

你们几乎涵盖了服务器信任客户端可能出现的所有问题。我想不出其他真正的问题。

因此,与其告诉你什么可能出错,不如看看什么是对的。

Valve 在他们的网络代码中投入了大量工作。阅读它

于 2009-03-06T02:00:13.443 回答