将游戏分数从客户端更新到服务器数据库的最安全方法?Javascript
所以我有一个完全在客户机上运行的游戏。除了下载最初的脚本来玩游戏外,没有任何服务器交互。无论如何,在游戏结束时,我希望客户端将分数发回给我,这些分数应该在服务器数据库中更新。现在,我已经接受了一个事实,那就是在地球上,我无法对黑客隐瞒这一点,也无法将分数一成不变地发送出去。但我想知道,直到什么程度,我可以修改整个过程,它实际上变得非常不可行的黑客操纵数据发送。当然,我不希望分数以明文形式从客户机发送,也不希望我的服务器执行复杂的解密算法。因此,实现相当大的安全性的最好方法是什么,每个汤姆·迪克和哈利都不会破解分数。。。我希望有人能提供一个很好的小方法,让我可以工作……:)谢谢 所以我的理想结果应该是->从一个不可信的方(玩家)计算(分数)得到可信的结果 -编辑- 有人告诉我一些关于在图片获取请求中隐藏数据的事情。比如,我正在画布上实现这个游戏(html5)。因此,他在游戏结束时要求我从我的服务器上通过图像获取一个游戏,他们的请求应该包含哈希分数。我并不完全理解整个过程,但如果你能解释一下,我会非常高兴的!:) 尾声^因此您可以很好地屏蔽请求 shouvik我该怎么做 结尾^您可以编写要提交的校验和。与12312A12313A232类似,md5包含分数。将资产放入画布中,如 coda^server.com/images/md5_hash_of_score/goverties.png coda^可通过htaccess重写服务器端将游戏分数从客户端更新到服务器数据库的最安全方法?Javascript,javascript,database,client-server,cryptography,scoring,Javascript,Database,Client Server,Cryptography,Scoring,所以我有一个完全在客户机上运行的游戏。除了下载最初的脚本来玩游戏外,没有任何服务器交互。无论如何,在游戏结束时,我希望客户端将分数发回给我,这些分数应该在服务器数据库中更新。现在,我已经接受了一个事实,那就是在地球上,我无法对黑客隐瞒这一点,也无法将分数一成不变地发送出去。但我想知道,直到什么程度,我可以修改整个过程,它实际上变得非常不可行的黑客操纵数据发送。当然,我不希望分数以明文形式从客户机发送,也不希望我的服务器执行复杂的解密算法。因此,实现相当大的安全性的最好方法是什么,每个汤姆·迪克和
您可以使用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
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参数的问题,所以我不希望这对黑客来说太容易了。也许比这稍微复杂一点,比如使用一些操作策略,这些操作策略不是非常流程密集的,基本上都是基本的谜题,服务器可以在没有任何限制的情况下解决