【问题标题】:Securing data in javascript ajax call在 javascript ajax 调用中保护数据
【发布时间】:2014-06-04 06:47:38
【问题描述】:

我正在开发一个基于 JavaScript 的 chrome 应用程序(游戏)并将其排行榜存储在 Google App Engine 中。

每当一个关卡完成时,我都会将用户分数发送到 GAE 服务器以保存用户分数并更新排行榜。

ajax 调用如下所示

$.post( "someurl", { username: "John", time: "50" , level:"2" } );

由于 JavaScript 将驻留在用户浏览器中,我如何保护用户数据以防止受到攻击,因为从应用程序到 GAE 服务器的请求很容易被监控和操纵。

【问题讨论】:

  • 添加为评论而不是答案,因为它是非答案。您实际上是在问如何信任由不受信任的来源提交的数据,从该措辞中可以明显看出,不可能完美地做到这一点。有三种通用方法可以缓解该问题:第一,服务器端欺诈检测;其次,使用 HMAC 对内容进行混淆和频繁轮换的客户端机密;第三,要求登录,以便您可以通过删除他们的帐户来惩罚不良用户。这些都不是完美的,如果没有持续的工程努力,没有一个是可行的。

标签: javascript jquery ajax


【解决方案1】:

你的问题实际上比你想象的要深。

首先,让我们确定非常随意的保护措施是行不通的:需要一个知识渊博的用户毁掉你的记分牌和你的一天。但在某些时候,收益会递减,因为您不会指望有经验的黑客会故意破解休闲游戏的记分牌。

由于您正在制作 Chrome 应用程序,因此除非隐藏在 Native Client 模块中,否则您的代码是公开的,并提供了方便的调试器。

  • 假设您有一个函数 postScore(score),那么攻击者可以直接调用它,并且无论您使用什么身份验证或传输层,它都会发布一个受污染的分数。
  • 假设您有一个类似于postScore(gameState) 的函数来计算分数,可能还有一个取决于状态的标记。它会更难破解,但您仍然只会验证(服务器端)发送的数据。您需要对验证令牌很聪明才能成功。

最防篡改的方法是游戏状态的可验证日志。 想想国际象棋:在国际象棋中,有什么比记录走棋更好的方法来验证结果? 这样就不可能发布离谱的分数了。

这在实时游戏中实现可能并非易事,但您通常可以将游戏状态分解为离散事件,您至少可以估计转换的可能性。 IE。在滚动射击游戏中,记录每个命令是不合理的,但可以记录敌人的杀戮;然后,您可以验证是否可以按照给定的顺序杀死敌人。

顺便说一句,这仍然为复制其他人的结果打开了大门。这很难避免,尽管您可以通过在日志上运行某种用户令牌相关的加密技术让黑客的生活变得悲惨。

另一个重要的考虑因素是向服务器发送验证数据意味着服务器上的大量处理。这可能会很快耗尽 GAE 配额,因此您也需要在服务器上进行某种 DoS 保护 - 来自同一用户的过多请求(您应该仍在使用用户令牌)应该受到限制。一个明智的想法是仅验证得分前 10 名竞争者的游戏日志。

【讨论】:

  • 作为这个出色答案的后续行动,请考虑什么都不做。除非您为人们获得高分提供经济激励,否则您可能会惊讶地发现没有人会费心破解您的系统。诚然,我从来没有写过前 10 名的游戏,但我担心我的游戏会出现欺诈性分数,并且从来没有时间保护排行榜,你知道吗?人们更感兴趣的是玩好游戏而不是破解他们的分数。
  • 感谢 Xan!验证前 10 名的状态是最好的主意,我还可以混淆脚本以使其更难操作。
【解决方案2】:

您还可以在应用程序中实施安全层。

因此,您可以将身份验证令牌传递到请求标头中,而不是发送用户名(作为易于阅读/拦截的 POST 参数),这样更安全,因此在服务器端,您可以读取该身份验证令牌(唯一性),找到用户,并为您的请求执行操作。

您可以轻松增加这种方法的复杂性/安全性。例如:

1 - 您可以为身份验证令牌设置过期时间
2 - 您可以在每次用户登录时生成一个新令牌并删除旧令牌,从而防止用户在多个窗口同时在同一个帐户中玩相同的任务? :P

干杯

【讨论】:

    【解决方案3】:

    您使用的 POST 很好。

    更多您可以使用“会话”来确保安全。 为了代码安全,您可以将您的函数和其他重要代码放在一些不同的 php 文件中,并将它们包含在主文件中。让您的代码直接可见。

    或者你可以获取json格式的数据可能非常安全。

    谢谢

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2011-05-04
      • 2013-12-08
      • 2012-01-17
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      相关资源
      最近更新 更多