Iphone 安全在线游戏http get/post请求(如何避免重复发送相同的http req)

Iphone 安全在线游戏http get/post请求(如何避免重复发送相同的http req),iphone,objective-c,http,https,httpwebrequest,Iphone,Objective C,Http,Https,Httpwebrequest,在我的游戏/应用程序(iPhone)中,客户端向游戏http服务器发送http请求(get或post)。 申请表格如下: gameserver.com/userId/givebonus/100 例如,这将给userId加值100 现在,我们加密服务器请求,它将变成: gameserver.com/42c34c234/ghjghjg4hj32g42jh2/424j23gh4h234j23 我不会为某个黑客试图解密来揭示这一切的意义而大惊小怪, 我担心的是嗅探。 因为一旦黑客知道: gameserv

在我的游戏/应用程序(iPhone)中,客户端向游戏http服务器发送http请求(get或post)。 申请表格如下:

gameserver.com/userId/givebonus/100

例如,这将给userId加值100

现在,我们加密服务器请求,它将变成:

gameserver.com/42c34c234/ghjghjg4hj32g42jh2/424j23gh4h234j23

我不会为某个黑客试图解密来揭示这一切的意义而大惊小怪, 我担心的是嗅探。 因为一旦黑客知道:

gameserver.com/42c34c234/ghjghjg4hj32g42jh2/424j23gh4h234j23

加上+100,它可以一次又一次地发送相同的请求

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

与少数朋友交谈,这些都是可能的解决方案,但没有一个更容易实施或更安全:

  • 移动所有(大部分)逻辑服务器端
  • 与第一个请求握手并仅响应该mac地址。(我想这行不通)
  • 动态更改私有加密密钥?怎么做
  • 加密整个请求,基本上使用https?(不知道怎么办:)
我确信有一个我看不到的更简单的答案:p

安全性很难。当你暗中信任客户端时,安全性是不可能的。你需要考虑为了保护它你愿意付出多少努力,以及如果它被破坏,你会损失多少。因为除非你基本上运行服务器端的所有东西,否则你可以期待它会受到损害

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


但不要被愚弄到认为这在某种程度上是“安全的”,因为它不是。

您可以使用一种变体来防止对网站的CSRF攻击(我假设您正在控制服务器):

  • 让客户机向
    http://gameserver.example/userId/givebonus
    • 在服务器端生成UUID或类似的东西,将其存储在服务器上的DB中,并与某种“挂起”表中的用户ID关联
    • 对此GET的响应应包含此UUID(如HTML表单中的隐藏标记)
  • 让客户端发送一个POST请求,其中包含UUID和您想要给出的分数。
    • 在服务器上,对照数据库中的UUID进行检查,如果之前没有执行过,则仅执行增量。在事务期间,将其从挂起列表中删除
(这有几个变体,您可以通过这些变体对令牌进行签名,但我认为通常很难在新的UUID上进行重播。)

作为补充说明,我建议不要在
http://gameserver.com/userId/givebonus/100
.GET是一种安全的方法,也就是说,您可以根据需要多次执行,并且不会影响服务器状态;这是通过HTTP和REST的设计实现的。显然,如果您对GET执行操作,这会导致问题。我建议对有副作用的操作使用POST,然后将金额和操作名称放入请求实体中


(当然,将HTTPS与之结合使用并没有害处。)

没有简单的答案。为什么不使用ssl?或者预共享密钥不起作用。有人想要获得奖金,可以解析html。此外,这是一个iPhone应用程序,因此必须将UUID发送到设备以响应http请求,攻击者可以轻松调用该服务。我的意思是为了防止重播攻击k、 据我所知,这是必须的。话说回来,你是对的,用户可能会做出虚假的请求。为了防止在金额上作弊,我认为这需要更多地了解游戏涉及的整个过程。评分应该由服务器根据游戏中的某些动作进行,而不是在12月份之前或者,应用程序可以签署一些东西,可能是通过在设备上生成公钥/私钥对(以避免发送相同的密钥)并首先注册。