在javascript ajax调用中保护数据

时间:2014-06-03 04:20:41

标签: javascript jquery ajax

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

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

ajax调用看起来像这样

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

由于JavaScript将驻留在用户浏览器中,如何保护用户数据以防止受到攻击,因为可以轻松监视和操作从应用程序到GAE服务器的请求。

3 个答案:

答案 0 :(得分:2)

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

首先,让我们确定非常随意的保护不起作用:需要一位知识渊博的用户来破坏你的记分牌和你的一天。但是在某些时候,回报会逐渐减少,因为你并不期待有经验的黑客故意破坏休闲游戏的记分牌。

由于您正在制作Chrome应用,因此除非隐藏在Native Client模块中,否则您的代码将处于打开状态,并提供方便的调试器。

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

最防篡改的方法是游戏状态的可验证日志。想想国际象棋:在国际象棋中验证结果的最佳方法是采取行动的日志吗?这样就无法发布令人发指的分数。

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

顺便说一下,这仍然是打开复制别人结果的方法。虽然你可以通过在日志上运行某种依赖于用户令牌的加密技术来使黑客的生活变得悲惨,但这很难保护。

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

答案 1 :(得分:0)

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

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

您可以轻松提高此方法的复杂性/安全性。例如:

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

干杯

答案 2 :(得分:-3)

你正在使用好的POST。

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

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

感谢