【发布时间】:2014-10-23 04:47:53
【问题描述】:
关于标签
我已将此标记为 Java 和 C++ 问题。这意味着我不是在寻找特定语言的答案。我只标记了 C++ 和 Java,因为我精通它们,如果它们是用这些(或类似)语言编写的,很可能会理解您的代码示例。
我在寻找什么?
指针和洞察关于我在开发软件时应该考虑的安全措施,主要是游戏,例如下面描述的。我所说的安全性是指检查并仔细检查用户没有以不希望的方式进行操作。这可能意味着诸如将他/她的现有最恶意病毒的更新集合发送到服务器/其他客户端等行为,或以其他方式损害其他玩家的用户体验,例如黑客攻击。
预期的问题和答案
您是在问如何阻止人们破解您的游戏?
无论如何,这不是我的问题,因为它方式对于这个线程来说太宽泛了。但是,如果您确实遇到了赢得每场比赛的简单方法(通过作弊),那么请告诉我。
这个问题更适合X
我已经在 CodeReview 和 Programmers 中问过这个问题;在这两个网络中,这个帖子都受到了不好的欢迎。公平地说,它在这里也很受欢迎(参考 ADTC 的评论),因此是赏金。放置赏金后,我重写了这篇文章以更好地满足 SO 的标准。但是,如果您仍然认为这篇文章不适合这里,请告诉我原因。我很难确定这是否真的更适合 SO 或程序员,所以不要认为这只是我在没有考虑一秒钟后发布在这里的转储。
要在两台机器之间建立连接,你应该使用套接字。谷歌一下。
我不是在寻求这种技术帮助。我知道如何实现该软件,这不是我第一次这样做。请看我问的实际问题。
我为什么要问这个?
有问题的软件
我正在开发一款类似蛇的多人游戏,玩家可以在其中使用自己的算法来确定蛇的下一步动作。玩家通过客户端-服务器连接相互连接,也就是说,一个玩家将充当主机。您可以假设服务器代码将等到所有玩家轮到他们,直到更新所有客户端之间的游戏状态。
关于游戏
我的游戏在文件夹中搜索任何兼容的 .jar 文件,其主类扩展了特定的抽象类。然后,玩家可以通过网络直接连接到其他玩家或通过从大厅搜索游戏来连接到其他玩家。
在玩游戏时,每个玩家都会使用自己的算法来确定蛇的下一步动作。每个游戏的持续时间可能会有很大差异,具体取决于为游戏指定的更新率,但大多数情况下它们很快并且很可能会在 30 秒内结束。
我还没有实现实际的网络多人游戏。
一个逻辑的模板源文件如下:
package template
import snake.*;
public class TemplateLogic extends SnakeLogic {
@Override
public void onLaunch() {
}
@Override
public String getMove() {
return "UP";
}
}
所以我打算做的是,从托管玩家的角度来看,以字符串格式(“上”、“下”、“左”、“右”)通过网络获取玩家的下一步动作),因此在这方面不会有任何安全问题。每个客户用来确定下一步行动的实际程序只会在各自客户的计算机上运行。
我希望你一直在关注我。无论如何,我现在关心的是我可能忽略的任何其他坑洼。确定所有这些坑洼可能有点太繁琐了,所以我不会主要问这个。让我对此事有所了解是我所期待的。理想情况下,我可以从不同人的多个答案中获得更大的了解。
悬而未决的问题是,我能否阻止任何客户在他们的程序中使用会损害其他玩家的用户体验的方法?这样的方法可以是例如Thread.sleep():如果玩家让他的算法在每次移动之间等待 10 分钟,那将是非常烦人的。对于这个特殊的问题,我想我会为每个动作设置一个时间限制,之后落后/恶意的玩家将被踢出或分配一个默认动作,以便游戏可以正常继续。
旁注:
@Darinth 的回答让我想起了游戏的一个很重要的方面:允许用户输入,意思是蛇的下一步动作可以由人类玩家决定——也就是游戏可以用键盘正常弹奏。此外,没有什么会限制您在纯 AI 和纯键盘解决方案之间进行选择:您可以将它们混合在一起,例如,自己控制蛇,并在 AI 注意到您将自己逼入陷阱时接管。
总结一下
我是否忽略了一些重要的事情?我已计划将此作为一个小项目,供我和我的朋友消磨时间,但我有点狂热。
无论你的想法多么渺小,请毫不犹豫地回答。如果您想到更多兴趣点,您可以稍后编辑答案以使其更全面。我会定期检查任何答案以进行修改。
感谢您的宝贵时间。
我从答案中或自己获得的相关想法
每次移动后将游戏状态的哈希值与所有客户端进行比较。 除了具有相同哈希值的玩家之外,所有玩家都将被踢出,最低要求主机将留在游戏(如果有 4 名玩家,其中 2 名玩家有一个哈希,另外 2 名玩家有另一个哈希,不包括主机的组将被踢,等等)。我想出了这个,但这要感谢@ToYono,所以归功于他。
游戏开始前,比较每个玩家的校验和。 所有与主机校验和不同的玩家都将被踢出(甚至不让进入游戏)。归功于@ToYono。
随机化任何排名匹配。 防止有效使用来自同一台机器的多个连接来玩同一游戏。如果一个玩家在一场游戏中玩多条蛇,他可能有一个算法试图合法地玩游戏,而两个算法只是破坏另一个玩家。归功于@Surt。
允许用户输入。这从一开始就被设计为游戏的一部分,但我忘了提及。感谢@Darinth 提出了这种可能性,从而让我想起了这一重要方面。
【问题讨论】:
-
最好将您的工作代码提交给code review并在那里询问。
-
您的 API / 模板接口必须是防弹的。告诉我们更多关于它的信息。如果任何用户想要作弊,他将不得不在其中找到一个漏洞。
-
如果作弊者是宿主,就说明他运行的是服务器代码?所以我猜作弊者可能会影响整个游戏
-
某种校验和是的,用于检查游戏的完整性。除非玩家也破解了这个:)
-
我认为这是一个很好的方法。一个被黑的游戏会取消所有玩家。
标签: java c++ security networking multiplayer