我知道这是不可能的,但我能接近多少?
我正在创造成就,当用户“获得成就”时,他的浏览器会通过javascript弹出窗口告诉他,并向服务器发送消息以更新他的个人资料。
我宁愿让用户无法点击网络服务并获得所有成就。使用私钥对请求进行签名更好,但必须将其存储在.js文件中,然后轻松进行嗅探。我可以对它进行模糊处理,或者为每个用户做一个独特的工作。并为请求添加时间戳。
有更好的建议吗?
答案 0 :(得分:0)
问题是,你如何确定何人有成就?如果它是客户端,就像
quest.hasGoldenRod = true;
然后是的,你将无法阻止他们自己设置。
这样做的方法是让服务器镜像客户端采取的操作,以确保他们真正合法地获得该项目。
然后,当客户说“我明白了”时,服务器会“让我检查一下”,如果它还可以验证客户确实得到了它,那么一切都很好并给他们成就。< / p>
答案 1 :(得分:0)
正如原始问题所承认的那样,我认为这基本上是不可能的 在这种情况下,让服务器重新运行客户端所做的事情真的很难。 (例如,关闭时机的平台游戏)
Obfustication可能是你最好的选择。首先做一些加密和包括 计时信息 - 每个用户使用公钥/私钥。这摆脱了基本的 交通嗅探/重播。客观代码也是如此,以至于他们至少要这样做 付出一些努力来解码它。我会说这可能会消除99%的 人们试图欺骗。直到最后1%写入一个firefox附加组件才能解锁 成就,并至少给其他99%。
除此之外,没有成就奖励他们任何重要的。
答案 2 :(得分:0)
签名对你没有帮助。你有两种方法:
您可以进行完整验证。完全保证这一点的唯一方法是让服务器参与进来,就像丝绸说的那样。如果成就是用户到达游戏中的某个“区域” - 游戏发送“嘿我到了洛杉矶!”然后你去“我知道你做了。当你进入每个新区域时,你一直在告诉我,我一直在跟踪。”
您可以使用混淆和计时等技术进行“合理”验证。让服务器将计算函数userEarnedGoldBarAcheivement向下发送到作为测试函数的客户端 - 并且函数每天都会稍微改变(所以如果你向我发送请求{goldBar:true,key:12345}我去“呃,呃,那把钥匙是昨天的!“)