2011-01-19 20 views
12

所以我有這個完全在客戶端運行的遊戲。除了下載初始腳本來玩遊戲之外,沒有服務器交互。無論如何,在遊戲結束時,我希望客戶將我應該在服務器數據庫中更新的分數發回給我。現在我已經接受了這樣一個事實,即我們無法從黑客身上隱藏這一點,並將分數保持不變。但我想知道,直到我可以修改整個過程的哪個級別,它實際上變得非常不可行,因爲黑客操縱正在發送的數據。當然,我不希望將分數作爲純文本從客戶機發送出去,我不希望我的服務器執行復雜的解密算法。因此,爲了達到相當數量的安全性,每個湯姆迪克和哈里都不會破壞分數,所以最好的方法是什麼?我希望有人能提供一個很好的小方法,我可以努力...... :)謝謝從客戶端到服務器數據庫更新遊戲得分最安全的方法? Javascript

所以我的理想結果應該是 - >由不可信任的一方(玩家)進行的計算(得分)得到值得信賴的結果!

CNC中

有人告訴我一些關於隱藏在圖片中的數據獲取請求。就像我在畫布上實現這個遊戲一樣(html5)。所以他在遊戲結束時要求我從我的服務器上通過圖像獲取遊戲,並且他們的請求應該包含哈希得分。我並不完全理解整個過程,但如果你能解釋它,會非常高興! :)

尾聲^這樣你就可以掩蓋的要求很好地

shouvik我怎麼做吧!?

結尾^你可以撰寫你想提交的校驗和。像12312312a12313a232是你的md5,其中包含分數。帶來的資產到畫布像

尾聲^ server.com/images/md5_hash_of_score/congratulations.png

尾聲^你可以通過htaccess的重寫服務器端

+0

這或多或少是一樣的問題http://stackoverflow.com/questions/1901352/preventing-cheating-in-online-chess-games – Quentin 2011-01-19 08:53:12

+0

@David,這是非常不同的!當他一個人玩的時候,我對他的比賽沒有任何問題,所以讓他去做任何他想做的事。如果他與得分混爲一談,我在我的服務器上有一個自適應算法,它檢查是否可以合理地實現得分,如果不是USER BANNED!但我不喜歡它很容易,就像只是修改AJAX帖子... – Shouvik 2011-01-19 09:05:51

回答

1

「現在我已經接受這樣一個事實,即我們可以從黑客身上隱藏這一點,並且可以不加修改地發送分數。

哦,是的,有!

您可以使用RSA或任何其他公鑰加密方法(也稱爲對稱密碼術)。

爲服務器創建一組(公鑰和私鑰)密鑰。 您的客戶端代碼是否包含您的服務器的公鑰。

在遊戲結束時,客戶端代碼使用此密鑰對分數進行加密並將兩者(普通分數和加密分數)發送到服務器。

服務器解密並檢查是否平原得分和解密的一個相同。 如果是,請接受分數。 如果不是,拒絕(中間有黑客或網絡錯誤)。

------- UPDATE ----------- --------------修正

由於豚草指出,這種攻擊我的方法完全失敗。

你真正想要的是具有(得分)由不可信的一方(播放器)做了一個測算可信的結果。沒有簡單的方法來實現這一點。

看到這個:http://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf

而且這一個:http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

這(這需要在訂購ACM數字圖書館):http://portal.acm.org/citation.cfm?id=643477.643479

0

你可以使用Ajax將分數(和任何標識符)發送到服務器?除非他們有像螢火蟲打開的東西,否則他們不會看到它發生。

var url = '/savescores.asp?userID=fredsmith&score=1098'; 
createRequest(); 
request.open('GET', url, true); 
etc 
+0

是的,我想到了阿賈克斯位。但我假設他們已經打開了主機。它只是在更新分數時從控制檯更改url參數的問題,所以我不希望這會讓黑客變得太簡單。也許比這更復雜一點,就像使用某種不是過程密集型的操縱手段一樣,基本上是可以由服務器解決而沒有問題的初級謎題。 – Shouvik 2011-01-19 08:52:56

0

令客戶端發送給您的憑證(或某種形式的會話信息的情況下,你沒有登錄憑據),並做了SSL(HTTPS)。這樣你就可以同時進行認證和完整性控制。對於服務器和客戶端都非常簡單且非常輕便。

+0

也許我錯過了加入,但這最終會在Facebook上結束:) – Shouvik 2011-01-19 09:02:56

+0

我正在向用戶發送FB分數。我不認爲通過ssl發送它會產生任何影響,因爲我不想阻止一名中間人攻擊。它更像是,我阻止了一個發送攻擊的人:D – Shouvik 2011-01-19 09:07:10

4

你似乎已經知道了這一點,但只是爲了強調; 你無法阻止某人這樣做;你只能儘可能地努力!

假設您目前提交的比分爲:

/submit_score.php?score=5 

有人在Fi​​rebug看可以很容易地分辨比分被提交在哪裏,並改變它。 submit_score.php將其作爲參數的名稱給出。得分是一個容易區分的整數。

  1. 更改終點:/interaction.php?score=5
  2. 更改參數名:/interaction.php?a=5

它越來越爲用戶很難找出到底是怎麼回事。

現在你可以做比分更難(再次,難,不是不可能的),要改變。首先,你可以對它進行加密(顯然你需要稍後才能對其進行解密)。

  1. Base64對它進行編碼。
  2. 數字 - >字母(1 = a,2 = b等)。
  3. 逆向分數表示的順序。

你的名字,你這樣做。所以你現在有interaction.php?a=e

你可以做的下一件事是用別的東西來散列分數。用分數發送散列,然後在服務器上重新計算它。例如,md5()的分數與一個隨機字符串,併發送得分(編碼),字符串,和散列在請求:

/interaction.php?a=e&str=abcde&hash=123456789abcefbc 

當請求到達服務器時,做到:

if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit; 

很明顯,人們可以(相對)輕鬆地瀏覽您的JavaScript代碼,看看發生了什麼;所以讓他們在那裏更難。縮小和混淆代碼。

如果你讓別人難以接受,他們會嘗試理解你的JavaScript,嘗試使用Firebug,不理解正在發生的事情,而不打擾;爲了在遊戲中獲得一些額外的點數。