保护客户端API

5

我正在为基于JavaScript的游戏构建服务器端API和客户端库,其中必须保护两个非常重要的功能。

  1. 每次玩耗费用户一定数量的积分
  2. 我们必须确保提交的得分是玩家实际获得的得分。

解决第一个问题似乎很简单;在每次玩耗费前,我们调用API,扣除用户账户并返回唯一的Play ID。当我们提交该次玩耗费的得分时,我们传递在开头发放的ID。

第二个问题让我有点困惑。最初,我考虑了基于ID和得分的客户端哈希算法,但很快意识到生成哈希的Javascript可以轻松地被反向工程,即使它被混淆过。此时,我考虑使用一个小型Flash组件来生成哈希,但我听说即使编译的Flash也可以被反编译。

为了增加背景信息,我计划使用Ruby构建服务器端API。

我很想听听Stack Overflow聪明的程序员提供的任何建议。感谢您的时间!

编辑:下面Homer6的答案对于更复杂的游戏来说是一个非常好的解决方案,但不幸的是这个游戏的简单性不值得采用那种方法。它是一个基于短时间玩耗费的游戏,因此得分只是完成一个级别所需的时间。


@Fifi,您的赏金包含额外的信息。 - Sagar Pandya
@SagarPandya,我不明白你在评论中的意思是什么? - Fifi
@Fifi,我因为第一条评论中的原因撤销了你的编辑。希望你不介意。 - Sagar Pandya
好的,明白了。但不幸的是我仍然没有一个令人满意的答案... - Fifi
@Fifi,我猜你可能需要提高悬赏的赌注!祝你好运! - Sagar Pandya
5个回答

7

制作游戏的服务器端。

您可以仅使API接收游戏中的操作。这样,得分是在服务器端完成的。虽然这样会更加耗费资源,但是更难伪造。

当然,如果有人足够聪明,仍然可以为此编写机器人。这也会增加游戏过程中与服务器交互的延迟时间。如果有一种方法可以使请求非阻塞,则可能有效。

希望对您有所帮助。


1
请思考一下如何实现类似魔兽世界这样的游戏,这可能会给你一些灵感。 - Homer6
由于游戏的简单性,实际上没有机会将事件发送到服务器,尽管这对于更复杂的游戏来说是一种非常优雅的解决方案。 - bloudermilk

6
作为经验法则,只需假设客户端的任何内容都可以被伪造。

1
对于我的情况来说,这是不幸的事实。对于更复杂的游戏,Homer6的答案似乎是最好的解决方案。 - bloudermilk

2

下载as3corelib库

让服务器生成一个密钥

该密钥将基于会话,并且还会在X分钟后过期

所有与服务器之间的数据都将使用此密钥进行加密

数据使用会逐渐失效的密钥进行加密,这使得它更加安全。


我还想补充一点,安全性是层层叠加的。并没有真正的正确答案,只有你觉得足够安全或者足够多的层次。 - The_asMan

1

0
将用户分数扩展为一种类似于日志的数据结构:
<action type="1" score="+3" totalscore="3" gamestate="depends on the game"/>
<action type="4" score="+1" totalscore="4" gamestate="depends on the game"/>

并创建一个服务器端验证算法。然而,将所有游戏逻辑移到服务器上会更加安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接