2010-08-16 89 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