php - as2 - 什麼是actionscript




阻止人們攻擊Flash遊戲基於PHP的高分錶的最好方法是什麼? (12)

我正在談論一個沒有高分限制的動作遊戲,並且沒有辦法通過重放動作來驗證服務器上的分數。

我真正需要的是Flash / PHP中最強大的加密功能,也是一種防止人們通過Flash文件調用PHP頁面的方法。 過去我曾嘗試過一些簡單的方法來進行單個分數的多次調用並完成校驗和/斐波那契序列等,並且還使用Amayeta SWF Encrypt對SWF進行了模糊處理,但它們最終都被黑掉了。

感謝StackOverflow響應,我現在發現了一些來自Adobe的更多信息 - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.htmlhttps://github.com/mikechambers/as3corelib我認為我可以用於加密。 不知道這會讓我在CheatEngine周圍。

如果它們不同,我需要知道AS2和AS3的最佳解決方案。

主要的問題似乎是TamperData和LiveHTTP頭文件,但我知道還有更高級的黑客工具 - 比如CheatEngine(感謝Mark Webster)


一個簡單的方法就是提供一個高分值的密碼哈希以及它自己的分數。 例如,在通過HTTP GET發布結果時: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095 : http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095 score= http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095 checksum= http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

計算這個校驗和時,應該使用共享密鑰; 這個秘密不應該通過網絡傳輸,而應該在PHP後端和閃存前端中進行硬編碼。 上面的校驗和是通過在字符串“ secret ”前加上“ 500 ”來創建的,並通過md5sum來運行。

雖然這個系統會阻止用戶發布任意分數,但它並不能阻止“重放攻擊”,即用戶重新發布之前計算的分數和散列組合。 在上面的例子中,500的分數總是會產生相同的散列字符串。 通過將更多信息(例如用戶名,時間戳或IP地址)包含在要進行散列的字符串中,可以緩解某些風險。 儘管這不會阻止數據的重播,但它將確保一組數據僅對單個用戶在同一時間有效。

為防止發生任何重播攻擊,必須創建一些類型的質詢 - 響應系統,如下所示:

  1. Flash遊戲(“客戶端”)執行不帶參數的http://example.com/highscores.php的HTTP GET。 該頁面返回兩個值:一個隨機生成的值,以及該值的密碼散列與共享密鑰的組合。 這個salt值應該存儲在待定查詢的本地數據庫中,並且應該有一個與它關聯的時間戳,以便它可能在一分鐘後“過期”。
  2. Flash遊戲將salt值與共享密鑰組合在一起,併計算一個哈希值以驗證它是否與服務器提供的哈希值匹配。 這一步對於防止用戶篡改salt值是必要的,因為它驗證了salt值實際上是由服務器生成的。
  3. Flash遊戲將鹽分與共享秘密,高分值和任何其他相關信息(暱稱,IP,時間戳)結合起來,併計算出一個哈希值。 然後它通過HTTP GET或POST將此信息發送回PHP後端,以及salt值,高分和其他信息。
  4. 服務器將以與客戶端上相同的方式接收到的信息進行組合,併計算哈希以驗證其與客戶端提供的匹配。 然後它還驗證鹽值是否仍然有效,如掛起的查詢列表中所列。 如果這兩個條件都是真的,則它將高分寫入高分錶並向客戶返回簽名的“成功”消息。 它還從掛起的查詢列表中刪除salt值。

請記住,如果用戶可以訪問共享機密,則上述任何技術的安全性都會受到影響

作為替代方案,可以通過強制客戶端通過HTTPS與服務器進行通信並確保客戶端預先配置為只信任由您獨自訪問的特定證書頒發機構簽發的證書。


你不能相信客戶返回的任何數據。 驗證需要在服務器端執行。 我不是一個遊戲開發者,但我確實製作商業軟件。 在這兩種情況下都可能涉及金錢,人們會破壞客戶端混淆技術。

也許定期發送數據到服務器並做一些驗證。 不要關注客戶端代碼,即使這是您的應用程序所在的地方。


你在談論什麼叫做“客戶信任”問題。 因為客戶(在這個現金中,一個在瀏覽器中運行的SWF)正在做它正在做的事情。 保存高分。

問題是,你想確保“保存分數”請求來自你的Flash電影,而不是一些任意的HTTP請求。 對此的一個可能的解決方案是在請求時使用服務器生成的令牌(使用flasm )將SWF中的令牌編碼到SWF中,該請求必須伴隨請求才能保存高分。 一旦服務器保存該分數,該令牌就會過期並且不能再用於請求。

這樣做的缺點是,用戶只能提交一個高負荷的Flash影片 - 您必須強制他們刷新/重新加載SWF才能再次播放新的樂譜。


使用已知(專用)可逆密鑰進行加密將是最簡單的方法。 我並沒有全力以赴,所以我不確定那裡有哪些加密提供者。

但是你可以包含遊戲長度(再次加密)和點擊次數等變量。

所有這樣的事情都可以進行逆向設計,因此可以考慮投入一堆垃圾數據以將人們趕出香水。

編輯:這可能是值得在一些PHP會議夾。 當他們點擊開始遊戲並且(如本文評論所述)記錄時間時開始會話。 當他們提交分數時,你可以檢查他們實際上是否有一個開放的遊戲,他們沒有太快或太大地提交分數。

可能值得設計一個標量來看看每秒/分鐘的最高分數。

這些都不是不可實現的,但它有助於在閃存中有一些邏輯,人們可以看到它。


在被接受的答案中,tqbf提到你可以對記錄變量進行記憶搜索(“我的得分是666,所以我在記憶中尋找666”)。

有一種解決方法。 我在這裡有一堂課: http://divillysausages.com/blog/safenumber_and_safeint : http://divillysausages.com/blog/safenumber_and_safeint

基本上,你有一個對象來存儲你的分數。 在setter中,它將你傳遞的值乘以一個隨機數(+和 - ),並在getter中用隨機乘數除以保存的值以獲得原始值。 這很簡單,但有助於停止記憶搜索。

另外,請查看PushButton引擎背後的一些人的視頻,他們談論了一些可以打擊黑客行為的不同方式:http: http://zaa.tv/2010/12/the-art-of-hacking-flash-games/ 。 他們是班上的靈感。


我喜歡tpqf所說的,但不是在發現作弊行為時禁用帳戶,而是在登錄時實施蜜罐,他們會看到他們被黑的分數,並且從不懷疑他們被標記為巨魔。 谷歌為“phpBB MOD巨魔”,你會看到一個巧妙的方法。


我認為最簡單的方法是每次遊戲註冊要添加的分數時調用RegisterScore(分數)等函數,然後對其進行編碼,打包並將其作為字符串發送到php腳本。 PHP腳本會知道如何正確解碼。 這將停止任何直接對php腳本的調用,因為任何試圖強制分數都會導致解壓錯誤。


我通常包含高分條目的遊戲會話的“鬼數據”。 因此,如果我正在製作賽車遊戲,那麼我會包含重播數據。 您經常有重放數據用於重放功能或幽靈賽車功能(與最後一場比賽對抗,或者與排行榜上#14的哥們對戰)。

檢查這些是非常體力勞動,但如果目標是驗證比賽中前10名的參賽作品是否合法,這可能是其他人已經指出的安全措施的有益補充。

如果目標是保持高分榜線上直到時間的盡頭,沒有人看他們,這不會給你帶來太多。


根據我的經驗,這最好是作為一個社會工程問題而不是一個編程問題。 不要專注於使其無法作弊,而應該通過消除欺騙動機來使其變得無聊。 例如,如果主要激勵因素是公開可見的高分,則只要在顯示高分時延遲就可以通過去除作弊者的正反饋循環而顯著減少作弊。


每當您的高分系統基於Flash應用程序通過網絡發送未識別/未識別的高分數據時,可以攔​​截並操縱/重播。 答案如下:加密(體面!)或加密簽名高分數據。 這至少會讓人們難以破解你的高分系統,因為他們需要從你的SWF文件中提取密鑰。 很多人可能會放棄在那裡。 另一方面,所需要的只是一個人提取密鑰並將其發佈到某個地方。

真正的解決方案涉及Flash應用程序和高分數據庫之間的更多通信,以便後者可以驗證給定分數是否有些現實。 這可能很複雜,具體取決於你有什麼樣的遊戲。


真的不可能達到你想要的。 Flash應用程序的內部部分總是可以部分訪問的,特別是當您知道如何使用CheatEngine這樣的CheatEngine ,這意味著無論您的網站和瀏覽器服務器通信如何安全,它仍然會相對簡單地克服。


這是網絡遊戲和競賽的一個經典問題。 您的Flash代碼與用戶一起決定遊戲的分數。 但用戶不信任,並且Flash代碼在用戶的計算機上運行。 你是SOL。 沒有辦法阻止攻擊者創造高分:

  • Flash的反向工程比你想像的要容易得多,因為字節碼有很好的文檔記錄,並且描述了高級語言(Actionscript)---當你發布Flash遊戲時,你會發布你的源代碼,無論你知道與否。

  • 攻擊者控制Flash解釋器的運行時內存,這樣任何知道如何使用可編程調試器的人都可以隨時更改任何變量(包括當前得分),或者更改程序本身。

對您的系統的最簡單的攻擊是通過代理運行遊戲的HTTP流量,捕獲高分存儲,並以更高的分數重播。

您可以嘗試通過將每個高分保存到遊戲的單個實例來阻止此攻擊,例如通過在遊戲啟動時向客戶端發送加密的令牌,該令牌可能如下所示:

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(你也可以使用會話cookie來達到同樣的效果)。

遊戲代碼以高分保存將該令牌回傳給服務器。 但攻擊者仍然可以再次啟動遊戲,獲取令牌,然後立即將該令牌粘貼到重播的高分保存中。

所以接下來你不僅要提供一個令牌或會話cookie,還要提供一個高分加密會話密鑰。 這將是一個128位的AES密鑰,本身使用硬編碼到Flash遊戲中的密鑰進行加密:

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

現在在遊戲發布高分之前,它解密高分加密會話密鑰,它可以執行此操作,因為您將高分加密會話密鑰解密密鑰硬編碼到Flash二進製文件中。 您使用此解密的密鑰以及高分的SHA1哈希加密高分:

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

服務器上的PHP代碼檢查令牌以確保請求來自有效的遊戲實例,然後解密加密的高分,檢查以確保高分與高分的SHA1匹配(如果跳過此步驟,解密只會產生隨機的,可能非常高,高分)。

所以,現在攻擊者反編譯你的Flash代碼並且很快找到AES代碼,這樣的代碼就像拇指一樣突然出現,儘管它不會在15分鐘內通過內存搜索和跟踪器追踪(“我知道我的這個遊戲的分數是666,所以讓我們在內存中找到666,然後抓住任何接觸該值的操作---哦,看看高分加密代碼!“)。 使用會話密鑰,攻擊者甚至不必運行Flash代碼; 她抓取遊戲啟動令牌和會話密鑰,並可以發送任意高分。

您現在處於大多數開發人員都放棄的地步 - 通過以下方式給攻擊者帶來或需要幾個月的時間:

  • 用XOR操作加密AES密鑰

  • 用計算密鑰的函數替換關鍵字節數組

  • 在整個二進製文件中散佈偽造的密鑰加密和高分。

這主要是浪費時間。 毫無疑問,SSL也不會幫助你; 當兩個SSL端點中的一個出現問題時,SSL無法保護您。

以下是一些可以真正減少高分欺詐的事情:

  • 需要登錄才能玩遊戲,讓登錄產生一個會話cookie,並且不允許在同一個會話上啟動多個未完成的遊戲,或者不允許同一個用戶進行多個並發會話。

  • 拒絕遊戲會話中的高分,該分數比有史以來最短的真實遊戲少得多(對於更複雜的方法,嘗試“隔離”遊戲會話的高分,其持續時間比平均遊戲持續時間低2個標準差)。 確保你在服務器側追踪遊戲持續時間。

  • 拒絕或隔離僅玩過一次或兩次遊戲的登錄中的高分,以便攻擊者必須為他們創建的每個登錄名創建合理看待遊戲的“紙質足跡”。

  • 遊戲過程中的“心跳”分數,以便您的服務器在一次遊戲的整個生命週期內都能看到分數的增長。 拒絕不符合合理分數曲線的高分(例如,從0跳到999999)。

  • 遊戲過程中的“快照”遊戲狀態(例如彈藥數量,關卡位置等),您可以稍後與記錄的中間分數進行對比。 您甚至不必有辦法檢測這些數據中的異常情況; 你只需要收集它,然後你可以回去分析它,如果事情看起來很腥。

  • 禁用任何未通過安全檢查的用戶的帳戶(例如,通過提交未通過驗證的加密高分)。

請記住,你只是在這裡阻止高分。 沒有什麼可以做,以防止如果。 如果遊戲中有錢,那麼有人會打敗你提出的任何系統。 目的不是要阻止這種攻擊; 這是為了讓攻擊變得更加昂貴,而不僅僅是讓遊戲變得更加精彩並且擊敗它。





actionscript-2