2010-08-16 90 views
2

在我的游戏/应用程序(iPhone)中,客户端向游戏http服务器发送http请求(获取或发布)。 要求有这样的形式:安全在线游戏http获取/发布请求(如何避免重复发送相同的http-req)

gameserver.com/userId/givebonus/100

例如,这将使用户id的100

奖金现在,我们加密服务器的请求,将成为是这样的:

gameserver.com/42c34c234c234/ghjghjg4hj32g42jh2/424j23gh4h234h2j34j23

我不计较一些黑客试图解密此揭开这一切的意义, 我担心的是。 的Cos一旦黑客知道:

gameserver.com/42c34c234c234/ghjghjg4hj32g42jh2/424j23gh4h234h2j34j23

给出+100 奖金也可能只是不停地一遍又一遍发送相同的请求。

那么你如何防止这种情况呢?

与几个朋友聊天这些可能的解决办法,但他们都不是,要么容易实现或更安全:

  • 移动逻辑服务器端的所有(最)。
  • 握手第一个请求并仅响应该mac地址。 (这不会工作,我认为)
  • 动态更改私人密钥?怎么样?
  • 加密整个请求,基本上使用https? (不知道如何虽然:()

我敢肯定有一个更简单的答案,我不明白:P

+1

有没有简单的答案。 – zaf 2010-08-16 12:21:30

+0

你为什么不使用ssl?或预共享密钥 – Cesar 2010-08-16 12:26:25

回答

1

安全是安全,当你信任的客户端隐含的不可能。 。你需要考虑你为了保护这个目的而付出了多少努力,以及如果它受到损害会损失多少。因为除非你基本上在服务器端运行所有的东西,否则你可以预计它会在将会是得到妥协

如果你只需要停止重播攻击,只需在命令预加密中添加递增的“请求计数”,并丢弃任何重复的请求即可。

但不要被愚蠢地以为这是某种“安全”,因为它是而不是

0

你可以用一个什么样的用于防止网站CSRF攻击的变体(我假设你是在控制服务器):

  • 在客户端做一个GET请求http://gameserver.example/userId/givebonus
    • 在服务器端生成一个UUID或类似的东西,您将其存储在服务器上的一个数据库中,并在某种“挂起”表中与该用户ID相关联。
    • 这个GET应该包含(在HTML表单就像一个隐藏令牌)此UUID的响应
  • 在客户端发送POST请求,包含UUID和点,你想给。
    • 在服务器上,检查数据库中的UUID,并且只在之前没有完成时执行增量。在交易过程中将其从待处理清单中删除。

(这方面有几个变种,因此你可以签署的道理,但我认为这将是很难做到的,一般一个新的UUID重播。)

作为注意,我建议不要在http://gameserver.com/userId/givebonus/100上通过GET请求进行增量。 GET旨在成为一种安全的方法,即您可以随意多次执行,而且不会影响服务器状态;这是通过HTTP和REST设计的。显然,如果你对GET采取行动,这会造成问题。我建议使用POST进行带有副作用的操作,然后将请求实体中的金额和操作名称放入请求实体中。

(当然,使用HTTPS并没有什么坏处。)

+0

不起作用。有意图获得奖金的人可以解析html。此外,这是一款iPhone应用程序,因此UUID必须发送到设备才能响应HTTP请求,攻击者可以轻松地调用该服务。 – 2010-08-16 14:19:47

+0

我的意思是它可以防止重放攻击,据我了解,这是必需的。这就是说,你是对的,用户可以做出虚假的请求。为了防止数量上的作弊,我想,这需要更多地了解游戏中涉及的整个过程。应该由服务器响应游戏中的某些动作而不是由应用程序的决定给出分数。另外,应用程序可以签署一些东西,可能是通过在设备上生成一个公钥/私钥对(以避免运送相同的密钥)并首先进行注册。 – Bruno 2010-08-16 15:36:50