我目前和朋友一起在Flash遊戲上工作。 當玩家完成遊戲時,他希望將分數插入數據庫中。 他使用本教程的閃光燈 - http://www.tizag.com/flashTutorial/flashforms.php。 他製作的swf效果很好 - 它發佈數據。問題是我可以看到來自螢火蟲的請求。這開闢了另一個問題 - 任何更高級的用戶可能會插入他自己的分數,而不玩遊戲...隱藏POST/GET請求 - 閃存和PHP
那麼有沒有辦法隱藏Flash遊戲的請求? 這個問題的正確方法是什麼?
我目前和朋友一起在Flash遊戲上工作。 當玩家完成遊戲時,他希望將分數插入數據庫中。 他使用本教程的閃光燈 - http://www.tizag.com/flashTutorial/flashforms.php。 他製作的swf效果很好 - 它發佈數據。問題是我可以看到來自螢火蟲的請求。這開闢了另一個問題 - 任何更高級的用戶可能會插入他自己的分數,而不玩遊戲...隱藏POST/GET請求 - 閃存和PHP
那麼有沒有辦法隱藏Flash遊戲的請求? 這個問題的正確方法是什麼?
不,實在無法隱藏所做的請求。這是不可能的,如果Firebug或Live HTTP Headers在Web瀏覽器中運行,它不僅可以攔截它,還可以加載Wireshark並查找所有傳入和傳出流量並分析它。你需要的是一種加密或破壞的方法。例如,取他們的分數base64_encode(),然後取當前時間,將其反轉(也可以在其末尾添加一個鍵),然後取其MD5。將所有三條信息提交給服務器,如果時間超過5秒,他們可以編輯請求併發送一個錯誤信息。通過倒轉來檢查時間的有效性(然後如果你使用了一個密鑰,則將其加入),並確定它們是否匹配。當然,你可以運行一些複雜的加密算法,但最終沒有意義:
有沒有萬無一失的方法來解決這個問題。我曾經在逆向工程領域工作。我可以告訴你,我可以在任何Flash遊戲中編輯任何值。因此,雖然提交評分可能有點安全,但我可以反編譯你的遊戲並查看代碼,並查看你做了什麼來破壞評分提交。或者,更容易的是,我可以編輯大概在60秒以內的分數值。 Adobe Flash Player將變量存儲在內存中,這就是缺點,我可以輕鬆地在內存中編輯這些變量和值。
如果您正在努力應對防止逆向工程的挑戰,我會說您只是停止在破壞之中,並希望沒有人像我一樣玩您的遊戲。爲防止逆向工程做了許多嘗試,我只是這樣說:破壞和「安全」只會讓誠實的人不在。對於現實世界和編程都是如此。真正想要利用系統並具備這種能力的人很容易。它只會阻止偶然的黑客和騙子作弊。安全和避開它的方法之間的平衡總是接近平衡。
解決方案可能是使用某種形式的預加密密鑰進行加密。服務器和Flash應用程序都需要使用算法對請求進行編碼。如果你想要做的只是重複請求,你仍然可以很容易地解決這個問題。
這是基於AES的一些信息,看起來我的權利: http://www.lostinactionscript.com/blog/index.php/2009/11/29/aes-cryptography-for-actionscript-php/
PS:當然也有更加複雜的解決方案,涉及的算法來確定基於一些測試下一個預共享密鑰,但這似乎太多的網頁遊戲。
解決此問題的簡單方法是作爲額外參數傳遞(當發佈到保存到db的頁面時),例如,可以是分數的md5加上一個祕密字符串。 例如,如果您發送的POST數據score:12345
,你可以這樣做score:12345&key:119c8901b84be882530d60a45539705f
在我的例子我計算的12345_secret
的MD5。 當您在服務器recive你的數據,你救他們只有md5(score+'_secret') == key
嗯,這種方法的一個問題是,所有的分數都與關鍵字相匹配,因此如果我的朋友得分爲9999,而我得分爲10,則我可以使用他請求中的數據並得到9999的分數以及。使用一個變量,如時間參數,可以阻止它。但是,好的答案,+1 – LostInTheCode 2011-06-08 12:49:19
是的,當然,你使用的變量越多,它變得越安全 - 包括一個唯一的用戶ID當然是一個不錯的選擇 – ArtoAle 2011-06-08 13:29:25
除了加密通訊,你可能會考慮增加一些「闖關」 - 曾經在一段時間,從客戶端發送一些狀態到服務器。這可能會引入一些延遲,但它可以使服務器上的客戶端狀態成爲可能。爲了完全(好,幾乎全部)安全,所有關於每個用戶行爲的決定都應該在服務器上進行。這對於模擬用戶操作的複雜機器人來說不起作用,但它將證明它不符合「分數提交者」。
好吧,如果他們可以編輯這些問題,這不會解決問題「檢查站」的提交 – LostInTheCode 2011-06-08 12:51:00
@LostInTheCode,正如你已經寫到的,沒有什麼是萬無一失的。最安全的解決方案是使用高度加密的流量來發送用戶的操作並在服務器上(而不是在Flash遊戲本身)做出決定,但即使這樣也不會100%安全。 – binaryLV 2011-06-08 14:34:36
只要控件駐留在客戶端上,就無法保護您的遊戲。客戶的人數越多,獲得高分的機會越大。
我們從最簡單的方法開始:客戶在遊戲結束時提交分數。您可以使用任何您想要的棘手加密方法,但作弊者可以簡單地調整內存中存儲的分數。他甚至不需要知道你是如何加密數據的。
即使您在整個遊戲過程中定期進行此操作,它並不重要。考慮到時間限制,服務器可能會嘗試估計高分是無效的,但在某些時候,最終得分足夠接近以至於無法丟棄它。
騙子也可以改變遊戲給自己一個不公平的優勢。說遊戲的一部分圍繞着能夠猜測寶藏在哪個門後面。他們所要做的就是破解遊戲,向他們展示數據。他們甚至不必修改分數生成代碼......因爲他們讓遊戲本身變得更加簡單。
在不受信任的平臺上安全解決此問題的唯一方法是將遊戲玩法的重要部分卸載到服務器本身。客戶變成了一個愚蠢的終端,無論它被告知什麼。服務器根據客戶的行爲實時追蹤高分。如果客戶不知道哪個門持有寶藏,則不能在上述示例中作弊。但是,這涉及服務器跟蹤每個客戶端的數據,這會導致您的資源使用量更高。根據遊戲的類型,它可能不可行。
而且,這一切都不是對所有黑客的失敗保險。例如,一個作弊者可以寫出一個具有超凡反應的機器人,否則這個機器人會遵守所有的規則。
如果你的遊戲足夠小,不會引起太多關注,其中一些是不必要的擔心。這是最終的安全性:製作一款沒有人願意玩的遊戲,因此沒有人會打擾黑客攻擊。 ;)
所有這一切說/總而言之,這裏有一些事情可以做:
商店高分的幾個變量,在內存中加密的實際內容。也就是說,試圖擺脫正在尋找記憶的騙子試圖找到分數。
與服務器通信時使用某種加密方式。您不希望騙子能夠簡單地嗅探流量併發出POST請求......這太容易了。
驗證考慮到播放的時間量,分數是有意義的。您可以定期向服務器每五秒鐘報告一次分數等。
使客戶端儘可能愚蠢......使服務器具有權威性。
如果有人發佈絕對無效的分數,請禁止該IP地址和/或用戶帳戶。
祈禱您的遊戲在黑客中不是很受歡迎。
我只是爲了防止作弊。你會推薦什麼來阻止人們通過對myScript.php進行POST來作弊? – tftd 2011-06-08 13:02:50
不,POST和GET對我來說都是一樣的。兩者都很容易被截獲。 – LostInTheCode 2011-07-17 20:14:03