好的,这个问题不是很清楚,因为我不能把它写成一个问题。
我有一个使用javascript设计的游戏,它基本上是一款多人游戏。 所以说有两个玩家,玩家黑暗领主和天使
天使拍摄黑暗领主 所以 darklord 失去了1条生命。
现在发生的事情是我使用ajax提交 darklord 失去的生命数量。 请求是GET /shootout.php?shooter=darklord&life=-1 所以这允许我存储 darklord 的新生命。
现在问题是天使知道计算机,他开始请求/shootout.php?shooter=darklord&life=-3
因此黑暗领主会失去更多的生命。所以天使在游戏中被骗了。
不,我想阻止这种请求,我试图找到一种方法,以便隐藏我的请求。我的意思是我知道我可以加密网址。所以说我加密了这个请求应该是GET /enc.php?e=934ufj30jf darklord 失去生命,而 e 的不同值让天使失去生命,或获得一点。但是为了实现这个目的,我需要将数据发送到客户端,就像告诉javascript请求这个URL一样。
现在,用户可以轻松地阅读文件的来源,以找出新的服务请求,
我已经发现并想到了许多其他方式,但它们都限制了作弊的数量或影响了游戏玩法等。它们都没有完全消除这种安全性。
所以现在我的问题是我如何确保用户不发送不真实的数据。我如何阻止他们作弊? 我想到了最好的方法,我使用服务器端脚本来实际计算某人射击别人然后将其与客户端输入匹配的可能性,但这将影响执行时间很多,所以我试图找到其他方式,一些公钥加密? (问题是用户可以根据需要放置数据然后加密)令牌? (问题是用户可以根据需要放置数据然后放入当前令牌)
所以任何其他人的想法?
答案 0 :(得分:2)
这不是关于隐藏请求,而是关于实现适当的访问控制。您的示例被称为不安全的直接对象引用,因为在与直接DB对象相关的查询字符串中操纵值会导致意外的结果(请查看OWASP Top 10 for .NET developers part 4: Insecure direct object reference)。
您可以做一些事情,但最重要的是实施适当的访问控制。您必须验证服务的调用者并授权他们执行所请求的活动(这一切都必须在服务器上进行)。在这种情况下,角度不应该代表黑暗领主执行动作。
您可以做的另一件事是使用间接对象引用映射(请参阅上面的链接),该映射使用加密强大的,特定于用户的替代方法来混淆播放器的ID。除了访问控制之外,您可能不需要它,但它确实会给您带来更多的不可预测性。
最后,考虑一下翻转面 - 如果黑暗领主能够将伤害量作为参数传递,那么阻止他用“life = -100”手动重新发出请求是什么?这将取决于攻击行动的具体方式,但您也希望避免人们游戏这一行动。
答案 1 :(得分:1)
您必须假设用户完全控制客户端JavaScript。保证安全的唯一方法是在服务器端进行检查。
答案 2 :(得分:1)
您不应发送行动结果。你应该发送行动。
即天使从点(7,15)
拍摄 darkangel ,角度为36
度
比服务器检查是正确拍摄并减少 darklord
的生命答案 3 :(得分:1)
几年前就这个问题给出了很好的答案。它实际上是指Flash而不是JavaScript,但安全问题和技术也适用于这种情况。
What is the best way to stop people hacking the PHP-based highscore table of a Flash game
答案 4 :(得分:0)
您永远不应该让客户端告诉服务器在播放器状态下要进行哪些更改(例如,删除X健康状况),因为客户端可能总是在作弊。相反,只让客户端告诉服务器播放器输入了什么,然后服务器确定输入结果会发生什么。
虽然这并没有通过编写一个自动播放游戏的机器人(并且在游戏中比任何人类游戏更好)来消除作弊的可能性,但至少可以消除公开欺骗“我做了10,000次伤害,相信我“变种。
检测机器人最好通过跟踪行为数据和进行数据挖掘来找到作弊者。如果机器人和人类玩家之间没有行为差异,那么谁在乎机器人。