Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将游戏分数从客户端更新到服务器数据库的最安全方法?Javascript_Javascript_Database_Client Server_Cryptography_Scoring - Fatal编程技术网

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

将游戏分数从客户端更新到服务器数据库的最安全方法?Javascript,javascript,database,client-server,cryptography,scoring,Javascript,Database,Client Server,Cryptography,Scoring,所以我有一个完全在客户机上运行的游戏。除了下载最初的脚本来玩游戏外,没有任何服务器交互。无论如何,在游戏结束时,我希望客户端将分数发回给我,这些分数应该在服务器数据库中更新。现在,我已经接受了一个事实,那就是在地球上,我无法对黑客隐瞒这一点,也无法将分数一成不变地发送出去。但我想知道,直到什么程度,我可以修改整个过程,它实际上变得非常不可行的黑客操纵数据发送。当然,我不希望分数以明文形式从客户机发送,也不希望我的服务器执行复杂的解密算法。因此,实现相当大的安全性的最好方法是什么,每个汤姆·迪克和

所以我有一个完全在客户机上运行的游戏。除了下载最初的脚本来玩游戏外,没有任何服务器交互。无论如何,在游戏结束时,我希望客户端将分数发回给我,这些分数应该在服务器数据库中更新。现在,我已经接受了一个事实,那就是在地球上,我无法对黑客隐瞒这一点,也无法将分数一成不变地发送出去。但我想知道,直到什么程度,我可以修改整个过程,它实际上变得非常不可行的黑客操纵数据发送。当然,我不希望分数以明文形式从客户机发送,也不希望我的服务器执行复杂的解密算法。因此,实现相当大的安全性的最好方法是什么,每个汤姆·迪克和哈利都不会破解分数。。。我希望有人能提供一个很好的小方法,让我可以工作……:)谢谢

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

-编辑-

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

尾声^因此您可以很好地屏蔽请求

shouvik我该怎么做

结尾^您可以编写要提交的校验和。与12312A12313A232类似,md5包含分数。将资产放入画布中,如

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

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


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

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

让客户端向您发送凭据(或者在您没有登录凭据的情况下发送某种会话信息),并通过SSL(https)进行发送。通过这种方式,您可以同时进行身份验证和完整性控制。对于服务器和客户端来说都非常简单和轻量级

“现在,我已经接受了一个事实,那就是我根本无法对黑客隐瞒这一点,也无法将分数一成不变地发送出去。”

哦,是的,有

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

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

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

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

-------更新------更正--------------

正如安布罗西亚指出的,我的方法在这种攻击中完全失败了

你真正想要的是从不受信任的一方(玩家)计算(分数)得到一个可信的结果。实现这一目标并非易事

见此:

还有这个:


这(需要订阅ACM数字图书馆):

你似乎已经知道这一点,但只是强调一下你无法阻止某人这样做;你只能让它尽可能的难

假设您当前提交的分数为:

/submit_score.php?score=5
在Firebug中观看的人可以很容易地区分分数提交的位置,并修改它
submit_score.php
给出了它,参数的名称也给出了它。分数是一个容易区分的整数

  • 更改终点:
    /interaction.php?score=5
  • 更改参数名称:
    /interaction.php?a=5
  • 用户越来越难弄清楚到底发生了什么

    现在你可以让分数更难改变(同样,更难,不是不可能)。首先,您可以对其进行加密(显然,您以后需要能够对其进行解密)

  • base64编码它
  • 数字->字母(1=a、2=b等)
  • 颠倒分数表示的顺序
  • 你说出来,你就去做。现在有了
    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,不理解正在发生的事情,也不会费心;为了在游戏中获得一些额外的分数。

    使用类似OAuth的东西来授权从客户端到服务器的请求。
    标头包含与请求主体匹配的令牌。如果这两个不匹配,则放弃请求。不需要在服务器端解密,而是加密主体并检查在服务器端获得的结果和令牌是否匹配,以确定主体是否被修改

    是的,我计算了ajax位。但我想他们的控制台是开着的。这只是在更新分数时从控制台更改url参数的问题,所以我不希望这对黑客来说太容易了。也许比这稍微复杂一点,比如使用一些操作策略,这些操作策略不是非常流程密集的,基本上都是基本的谜题,服务器可以在没有任何限制的情况下解决