Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Network programming I';我正在制作一个多人游戏,我需要验证玩家是否';快速黑客攻击_Network Programming - Fatal编程技术网

Network programming I';我正在制作一个多人游戏,我需要验证玩家是否';快速黑客攻击

Network programming I';我正在制作一个多人游戏,我需要验证玩家是否';快速黑客攻击,network-programming,Network Programming,出于安全原因,我觉得应该在服务器端进行测试。尽管如此,这对服务器来说还是相当费力的,对吗?考虑到玩家穿戴的装备和buff,他们将有更高的移动速度,因此每次他们移动时,我都需要计算新的常数,看看他们的移动是否合法(使用TCP,因此不必担心丢失、无序的数据包)。我意识到我可以只保存上一次的移动速度,只有当他们改变了影响他们速度的东西时才重新计算,但即使这样,那也是另一次检查 我的另一个想法是,服务器随机选择客户端发送的数据,并对其进行验证,然后给每个客户端一个信任评级。足够低的信任等级意味着来自客户

出于安全原因,我觉得应该在服务器端进行测试。尽管如此,这对服务器来说还是相当费力的,对吗?考虑到玩家穿戴的装备和buff,他们将有更高的移动速度,因此每次他们移动时,我都需要计算新的常数,看看他们的移动是否合法(使用TCP,因此不必担心丢失、无序的数据包)。我意识到我可以只保存上一次的移动速度,只有当他们改变了影响他们速度的东西时才重新计算,但即使这样,那也是另一次检查

我的另一个想法是,服务器随机选择客户端发送的数据,并对其进行验证,然后给每个客户端一个信任评级。足够低的信任等级意味着来自客户端的每条消息都将被检查,他们的所有操作都将以更详细的方式记录。然后,我会通过检查日志来知道他们在进行黑客攻击,并可以禁止/暂停这些日志,以及撤销他们可能通过黑客攻击传播的任何好处

谢谢你的建议


编辑:我刚刚意识到还有一种情况,黑客可以连续发送非常高的微小动作(在其正常速度的能力范围内)。每一个单独的动作都是合法的,但累积的效果将是速度攻击。有哪些解决方法?

解决方法是所有操作都在服务器上完成。永远不要相信来自客户的任何信息。如果有人真的玩你的游戏,有人会反向工程与服务器的通信,并找出如何利用它

你不能分配一个随机的信任等级,因为谨慎的骗子只有在他们真正需要的时候才会作弊。这给了他们相当大的优势,被发现作弊的几率很低


而且,是的,这意味着您无法使用低级服务器,但实际上没有其他方法可以防止客户端欺骗。

解决方法是所有操作都在服务器上完成。永远不要相信来自客户的任何信息。如果有人真的玩你的游戏,有人会反向工程与服务器的通信,并找出如何利用它

你不能分配一个随机的信任等级,因为谨慎的骗子只有在他们真正需要的时候才会作弊。这给了他们相当大的优势,被发现作弊的几率很低

是的,这意味着你不能使用低级服务器,但实际上没有其他方法可以防止客户端欺骗

[…]测试应该在服务器端完成。尽管如此,这对服务器来说还是相当费力的,对吗

没有。这是做这件事的方法。这是唯一的办法。所有关于检查信任或任何固有缺陷的讨论,都是这样或那样的

如果您让玩家发送位置:

  • 检查某人声称他们在哪里
  • 与他们不久前的情况相比。允许一点偏差来解释网络延迟
  • 如果它们移动得太快,请将它们重新定位到更合理的位置。小的误差可能是由于长时间的滞后,所以客户应该使用插值来平滑这些校正
  • 如果它们移动得太快,请断开它们的连接。并检查代码中的错误
  • 不要忘记处理远距离的合法穿越,例如远程传送
[…]测试应该在服务器端完成。尽管如此,这对服务器来说还是相当费力的,对吗

没有。这是做这件事的方法。这是唯一的办法。所有关于检查信任或任何固有缺陷的讨论,都是这样或那样的

如果您让玩家发送位置:

  • 检查某人声称他们在哪里
  • 与他们不久前的情况相比。允许一点偏差来解释网络延迟
  • 如果它们移动得太快,请将它们重新定位到更合理的位置。小的误差可能是由于长时间的滞后,所以客户应该使用插值来平滑这些校正
  • 如果它们移动得太快,请断开它们的连接。并检查代码中的错误
  • 不要忘记处理远距离的合法穿越,例如远程传送

    • 处理此问题的标准方法是让服务器计算所有移动。客户端应发送给服务器的唯一内容是命令,例如“向左移动”,然后服务器应计算玩家移动的速度等,最后将更新的位置发送回客户端


      如果您将任何计算留在客户端上,很可能迟早会有人找到作弊的方法。

      处理此问题的标准方法是让服务器计算所有移动。客户端应发送给服务器的唯一内容是命令,例如“向左移动”,然后服务器应计算玩家移动的速度等,最后将更新的位置发送回客户端


      如果您将任何计算留在客户端上,很可能迟早会有人找到作弊的方法。

      如果您使用的是一种可以访问Windows API函数调用的语言,我从自己对速度黑客的研究中发现,通过调用两个函数并比较结果,您可以轻松识别速度黑客

      而且

      这两个函数都将返回系统启动后的秒数。但是,TimeGetTime比GetTickCount准确得多,而
      TimeGetTime
      的准确度高达~1ms,而
      GetTickCount
      的准确度约为~50ms

      即使这两个功能之间有一个小的延迟,如果你打开一个速度黑客应用程序(选择你的毒药),你应该