2011-06-27 16 views
2

我有一個java服務器通過json-rpc與java客戶端進行通信。客戶端應該向修改服務器行爲的服務器報告內部統計信息。客戶端和服務器端都是內部編寫的,所以我可以控制客戶端的功能以及它如何報告統計信息,但有沒有辦法可以驗證客戶端代碼是否未被修改?如果有,它仍然會服務客戶端,但使用一些默認行爲。如何從服務器驗證客戶端代碼沒有被修改

客戶端將公開提供,所以對反編譯和改變行爲的人來說沒什麼大不了的。

只需讓客戶端發送代碼的簽名就不好,因爲通過將客戶端的原始副本與修改後的副本保持一致,可能很容易被欺騙。

+1

我不認爲你可以。想象一下,你有這樣一個聲稱的網絡消息,你會接受爲有效的。你怎麼能把它與其他客戶播放的錄音區分開來? –

回答

4

你不能。你基本上無法知道在客戶端上運行什麼代碼,並且你的程序邏輯都不應該依賴於將客戶端視爲「可信」。所有訪問控制,驗證等都應在服務器上完成(或在兩個地方完成)。

某些專業環境(例如,嵌入在智能卡上的代碼或諸如遊戲控制檯的設備,其操作系統僅用於運行簽名代碼)給了您更多的保證,因爲逆向工程/獲取難度增加對設備進行適當的控制。但即使這些也不是無懈可擊的(看看iPhone或任何控制檯,看看這些設備需要多長時間才能被「破解」),而不是這樣做,以便讓您瞭解安全級別。

0

您無法驗證客戶端是否未通過客戶端 - 服務器架構進行修改。

除非已通過身份驗證的用戶(登錄名和密碼匹配)通過安全連接(例如SSL)與您通話,否則不應該信任來自客戶端的輸入。

客戶端必須調用邏輯而不是將其發送給服務器。

+2

不過要小心。 「能夠通過SSL發送正確的登錄信息」並不意味着「正在使用我認爲正在使用的代碼發送該登錄信息」。 –

0

首先想到的是客戶端發送一個簽名文件(代碼內)和一個哈希自己。

但是,就像你說的那樣,它可能被欺騙。

如果您試圖依靠客戶端的真實性來做服務器上的東西:不要!重新思考你的邏輯。如果這只是一個額外的安全措施(與它一起)。

相關問題