保护客户端API

Securing a client-side API

本文关键字:API 客户端 保护      更新时间:2023-09-26

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

  1. 用户必须为每次播放借记
  2. 我们必须确保提交的分数是玩家实际获得的分数。

解决第一个问题似乎很简单;在每次游戏开始时,我们都会访问API,从用户的账户中扣款并返回一个唯一的play ID。当我们提交用户的分数时,我们传递开始时发布的ID。

第二个问题把我难住了。最初我考虑了基于ID和分数的客户端散列算法,但很快意识到生成散列的Javascript可以很容易地进行反向工程,即使它被混淆了。在这一点上,我考虑了一个生成散列的小flash组件,但我听说即使编译过的flash也可以被反编译。

为了增加上下文,我计划用Ruby构建服务器端API。

我很乐意听到Stack Overflow聪明的程序员提供的任何建议。谢谢你的时间!

编辑: Homer6给出的答案对于更复杂的游戏来说是一个非常好的解决方案,但不幸的是,这款游戏的简单性并不值得使用这样的方法。这是一款基于短时间的游戏,所以分数只是玩家完成一个关卡所花费的时间。

让服务器端成为游戏的一部分。

你可以让API只接收游戏中的动作。所以评分是在服务器端完成的。虽然这将更加密集,但更难伪造。

当然,如果聪明的话,人们仍然可以为它编写机器人。这也增加了服务器交互对游戏玩法的延迟。如果有一种方法可以使请求非阻塞,它可能会起作用。

HTH

根据经验,只要假设客户端的任何东西都可以伪造。

下载as3corelib库
让服务器生成一个密钥
该密钥将基于会话,并且也将过期X分钟
所有进出服务器的数据都将使用此密钥进行加密

数据是用贬值的密钥加密的,这使它更加安全。

我建议您继续使用您的flash组件,并使用一个好的flash swf加密器,使其更安全,防止反编译。这可能会有所帮助:http://asgamer.com/2009/why-how-to-encrypt-your-flash-swf

将用户评分扩展为类似于日志的数据结构:

<action type="1" score="+3" totalscore="3" gamestate="depends on the game"/>
<action type="4" score="+1" totalscore="4" gamestate="depends on the game"/>

,并创建服务器端验证算法。但是,将所有的游戏逻辑都放到服务器上会更加安全。