从客户端到服务器数据库更新游戏分数的最安全方法?使用Javascript

时间:2011-01-19 08:32:30

标签: javascript database client-server cryptography scoring

所以我有这个游戏完全在客户端上运行。除了下载初始脚本以玩游戏之外,没有服务器交互。无论如何,在游戏结束时,我希望客户端将我应该在服务器数据库中更新的分数发回给我。现在我开始接受这样一个事实,即地球上没有任何办法我可以将其隐藏起来并将分数保持不变。但我想知道,直到我能在多大程度上修改整个过程,黑客操纵正在发送的数据几乎变得不可行。我肯定不希望得分作为客户端机器的纯文本发送,我不希望我的服务器执行复杂的解密算法。什么是最好的方式,因此实现相当大的安全性,每个汤姆迪克和哈里不破解分数...我希望有人可以提供一个很好的小方法,我可以工作...... :)谢谢

所以我的理想结果应该是 - >得到不信任方(玩家)的计算(得分)的可信结果!

- 编辑 -

有人告诉我一些关于在图片获取请求中隐藏数据的事情。就像,我在画布上实现这个游戏(html5)。所以他在比赛结束时让我告诉我从我的服务器上取一个游戏而不是图像,他们的请求应该包含哈希分数。我并不完全理解整个过程,但如果你能解释一下,那真的很高兴! :)

  

coda ^所以你可以很好地掩盖请求

     

shouvik我该怎么做!?

     

coda ^您可以撰写要提交的校验和。像12312312a12313a232是你的md5,其中包含分数。将资产引入画布,如

     

coda ^ server.com/images/md5_hash_of_score/congratulations.png

     

coda ^你可以通过htaccess重写服务器端

5 个答案:

答案 0 :(得分:4)

你似乎已经知道这一点,但只是为了压力; 你无法阻止某人这样做;你只能尽可能地努力!

假设您目前将分数提交为:

/submit_score.php?score=5

在Firebug中观看的人可以轻松区分分数的提交位置并进行更改。 submit_score.php将其与参数名称一起放弃。分数是一个易于区分的整数。

  1. 更改结束点:/interaction.php?score=5
  2. 更改参数名称:/interaction.php?a=5
  3. 用户越来越难以弄清楚正在发生的事情。

    现在你可以让分数变得更难(再次,更难,不是不可能)。首先,你可以对它进行加密(显然你以后需要能够对它进行加密)。

    1. Base 64对其进行编码。
    2. 数字 - >字母(1 = a,2 = b等)。
    3. 颠倒分数表示的顺序。
    4. 你说出来,你做到了。所以你现在有interaction.php?a=e

      接下来你要做的就是用其他东西来分数。发送带有分数的哈希值,并在服务器上重新计算。例如,md5()得分随机字符串,并在请求中发送得分(编码),字符串和哈希:

      /interaction.php?a=e&str=abcde&hash=123456789abcefbc
      

      当请求到达服务器时,请执行:

      if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit;
      

      显然,人们可以(相对)轻松地浏览您的JavaScript代码并查看正在发生的事情;所以让那里的人更难。缩小和混淆代码。

      如果你为某人做得足够困难,他们会尝试理解你的JavaScript,尝试使用Firebug,不了解发生了什么,而不是打扰;为了在你的游戏中获得一些额外的积分。

答案 1 :(得分:1)

  

“现在我已经接受了这样一个事实,即地球上没有任何办法可以将其隐藏起来并将分数保持不变。”

<击> 哦,是的,有!

您可以使用RSA或任何其他公钥加密方法(也称为不对称加密)。

为服务器创建一组(公共和私有)密钥。 让您的客户端代码包含服务器的公钥。

在游戏结束时,客户端代码加密分数(使用此密钥)并将两者(普通分数和加密分数)发送到服务器。

服务器解密并检查普通分数和解密分数是否相同。 如果是,请接受分数。 如果没有,请拒绝(中间有黑客或网络错误)。

------- UPDATE ----------- -------------- CORRECTION

正如Ambrosia指出的那样,我的方法完全失败了。

您真正想要的是通过不受信任方(玩家)进行的计算(得分)获得可信结果。没有简单的方法来实现这一目标。

请参阅:http://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf

还有一个:http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

这个(需要订阅ACM数字图书馆):http://portal.acm.org/citation.cfm?id=643477.643479

答案 2 :(得分:0)

您可以使用ajax将分数(和任何标识符)发送到服务器吗?除非他们有像萤火虫打开的东西,否则他们不会看到它发生。

var url = '/savescores.asp?userID=fredsmith&score=1098';
createRequest();
request.open('GET', url, true);
etc

答案 3 :(得分:0)

让客户端向您发送凭据(或者在您没有登录凭据的情况下发送某种会话信息)并通过SSL(https)执行此操作。这样您就可以进行身份​​验证和完整性控制。服务器和客户端都非常容易且非常轻量级。

答案 4 :(得分:0)

使用OAuth之类的方法授权从客户端到服务器的请求。 标头包含与请求主体匹配的令牌。如果这两个不匹配,则丢弃该请求。不需要在服务器端解密,而是对主体进行加密,并检查在服务器端获得的结果与令牌是否匹配,以查找主体是否被修改