【问题标题】:html form post/get data securityhtml表单发布/获取数据安全
【发布时间】:2011-07-31 11:30:40
【问题描述】:

好的,这个问题不是很清楚,因为我不能把它写成一个问题。

我有一个使用 javascript 设计的游戏,它基本上是一个多人游戏。 所以说有两个玩家,玩家darklordangel

天使射杀黑暗领主 所以 darklord 失去 1 条生命。

现在发生的事情是我使用 ajax 来提交 darklord 失去的生命数量。 请求是 GET /shootout.php?shooter=darklord&life=-1 所以这让我可以存储darklord的新生命。

现在问题是 angel 知道计算机,他开始请求 /shootout.php?shooter=darklord&life=-3

因此,darklord 失去了他应该拥有的更多生命。所以angel在游戏中作弊了。

不,我想阻止这种请求,我正在尝试找到一种方法来隐藏我的请求。我的意思是我知道我可以加密网址。所以说我加密了它,这样请求应该是 GET /enc.php?e=934ufj30jf 让 darklord 失去生命,而 e 的不同值让天使失去一条命,还是得一分。但是,要使其正常工作,我需要将数据发送到客户端,如告诉 javascript 请求此 url。

现在用户可以轻松地四处阅读文件的源代码,以便找出新的服务请求,

我已经找到并想到了许多其他方法,但它们都限制了作弊的数量或影响游戏玩法等。它们都没有完全消除这种安全性。

所以现在我的问题是如何确保用户不会发送不真实的数据。我如何阻止他们作弊? 我想到了最好的方法是我使用服务器端脚本来实际计算某人射击别人然后将其与客户端输入匹配的可能性,但这会影响执行时间很多,所以我试图找到其他方式,一些公钥加密? (问题是用户可以随意放置数据然后对其进行加密)令牌? (问题是用户可以随意放数据,然后放当前token)

还有其他想法吗??

【问题讨论】:

    标签: ajax security post get


    【解决方案1】:

    这不是隐藏请求,而是实施适当的访问控制。您的示例被称为不安全的直接对象引用,因为在与直接 DB 对象相关的查询字符串中操作值会导致意外结果(请查看 OWASP Top 10 for .NET developers part 4: Insecure direct object reference)。

    您可以做几件事,但最重要的是实施适当的访问控制。您必须验证服务的调用者并授权他们执行请求的活动(这一切都必须在服务器上发生)。在这种情况下,angle 应该不能代表黑暗领主执行操作。

    您可以做的另一件事是使用间接对象引用映射(请参阅上面的链接),它使用加密强度高、用户特定的替代方案来混淆玩家的 ID。除了访问控制之外,您可能不需要它,但它确实给您带来了更多的不可预测性。

    最后,也要考虑另一面——如果黑暗领主能够将伤害量作为参数传递,那么有什么可以阻止他手动重新发出“life=-100”的请求?这将取决于如何执行攻击操作的具体细节,但您也需要避免人们玩这个操作。

    【讨论】:

      【解决方案2】:

      您必须假设用户完全可以控制客户端 JavaScript。确保这一点安全的唯一方法是在服务器端进行检查。

      【讨论】:

      • 是的 - 换句话说,无论如何它都有可能被搞砸 - 无论如何:D
      【解决方案3】:

      您不应发送操作结果。你应该发送动作。 即 angel 从点 (7,15)36 度数射击 darkangel

      服务器检查是否正确射击并减少darklord

      的生命

      【讨论】:

      • 你仍然可以搞砸,我的意思是,如果我愿意,我可以发送错误的角度,虽然它会掩盖数据......似乎我们陷入了一个真正的困境......显然这是一个经典的在线游戏问题,还没有任何适当的解决方案来解决这个问题.. 我现在正在考虑通过提高作弊难度来解决这个问题,但是没有 100% 安全的解决方案 - 无论如何,谢谢:D
      【解决方案4】:

      几年前在这个问题上有一个很好的答案。它实际上是指 Flash 而不是 JavaScript,但安全问题和技术也将适用于这种情况。

      What is the best way to stop people hacking the PHP-based highscore table of a Flash game

      【讨论】:

      • 阅读 - 简而言之,没有 100% 安全的方法来解决问题。
      • 基本上是这样。引用链接中的最后一句话:The objective isn't to stop this attack; it's to make the attack more expensive than just getting really good at the game and beating it.
      【解决方案5】:

      您永远不应该让客户端告诉服务器要对玩家状态进行哪些更改(例如,移除 X 量的生命值),因为客户端可能总是在作弊。取而代之的是,客户端只需要告诉服务器玩家做了什么输入,然后服务器确定该输入的结果。

      虽然这并不能通过编写一个自动玩游戏的机器人来消除作弊的可能性(并且在游戏方面比任何人类玩家都好),但你至少可以消除“我造成 10,000 伤害,相信我”的公开作弊“品种。

      最好通过跟踪行为数据和进行数据挖掘来寻找作弊者来检测机器人。如果机器人和人类玩家之间没有行为差异,那么谁在乎机器人。

      【讨论】:

        猜你喜欢
        • 2015-10-07
        • 1970-01-01
        • 2013-09-11
        • 2016-07-16
        • 2022-10-20
        • 1970-01-01
        • 1970-01-01
        • 2023-02-18
        • 2018-12-22
        相关资源
        最近更新 更多