2009-08-13 62 views
0

我知道这是不可能的,但我能得到多么接近?安全性:客户端数据重新编码,同时保持完整性

我创造了成就,当用户'获得成就'时,他的浏览器会通过JavaScript弹出框告诉他,并向服务器发送消息以更新他的个人资料。

我宁愿没有我的用户能够打网页服务并获得所有成就。使用私钥签署请求会更好,但必须将其存储在.js文件中,然后轻松地进行嗅探。我可以混淆它,或者为每个用户做一个独特的。并为请求添加时间戳。

有什么更好的建议吗?

回答

0

正如原来的问题所承认的,我认为这在 情况下基本上是不可能的,在这种情况下很难让服务器重新运行客户端的操作。 (例如,一个平台时间接近的游戏)

Obfustication可能是你最好的选择。首先做一些加密,并包括 计时信息 - 使用每个用户的公钥/私钥。这可以消除基本的流量嗅探/重放 。注重客户端代码,所以他们至少不得不为解码它。我认为这可能会消除试图欺骗的99%的人。直到最后1%写入一个Firefox附加组件解锁 成就,并至少给其他99%。

除此之外,好吧,没有任何成就奖励他们与任何东西重要

  • 科林
0

那么问题是,你如何确定何时有人有成就?如果是客户端,就像

quest.hasGoldenRod = true; 

那么是的,你会遇到麻烦,阻止他们自己设置。

做到这一点的方法是让服务器镜像客户端所采取的操作,以确保他们实际上合法获取了该项目。

然后,当客户说'我明白了'时,服务器会'让我检查',并且如果它也可以验证客户端确实得到它,那么一切都很好,并为他们提供成就。

+0

有趣的。可以说成就是‘键入的文本保罗到一个文本框’,然后服务器无法效仿。它可以知道,它给用户一个搜索框,但可以” t知道该操作 – 2009-08-13 05:15:46

+0

另一方面,您*可以*将文本框的内容发送到服务器,并至少检查它是否与该单词匹配。 – Amber 2009-08-13 05:20:06

+0

重复“paul”情形,重复此操作。您在客户端上执行此操作,并将相同的指令发送到服务器,然后确保它们处于相同状态。 – 2009-08-13 05:25:26

0

签名不帮你。你有两种方法:

  1. 你可以去完整的验证。唯一能够完全保证这一点的方法就是让服务器参与进来,就像丝绸般的说。如果成就是用户在某个游戏中遇到某个“区域” - 游戏会发送一个“嘿,我到了洛杉矶!”你就会“我知道你做到了,当你进入每个新区域时,你一直告诉我,我一直在跟踪。”

  2. 您可以使用混淆和定时等技术进行“合理的”验证。让服务器将计算函数userEarnedGoldBarAcheivement发送到作为测试函数的客户端 - 并且该函数每天都会稍微改变(所以如果您向{goldBar:true,key:12345}发送请求,我会“呃,呃,那个关键是昨天的!“)

相关问题