2010-03-30 34 views
8

我正在使用JavaScript的一些HTML和CSS的遊戲,我想知道是否有任何辦法,以確保遊戲,使用戶不能只是調用game.php?結果=勝利完成比賽,並獲得有一點。如何在JavaScript中製作安全的遊戲?

截至目前這裏是我的解決方案。

  • 對於機會遊戲,結果開始 的頁面已經到位,贏得 或鬆動,然後就做一些 動畫表現出來,但所有的 成績,贏得/鬆的東西做服務器端爲 。

  • 對於對戰遊戲,只得到從JavaScript調用的 行動,並 做傷害計算,服務器上的oponent的反應 ,只是 發回的數據。

但最後的解決方案意味着每次用戶執行任何操作時都必須發送操作。這可能適用於逐輪轉戰遊戲,但我認爲這將會減慢任何其他類型的遊戲。所以我的問題是,有沒有一種安全的方式,我可以準備我的JavaScript來保護髮送的信息。

回答

13

,以確保安全它擁有所有的計算和驗證的唯一途徑發生在服務器端。這就是它在幾乎所有的在線遊戲上所做的事情。客戶端永遠不會被在線通信所信任,並且您必須始終確保在服務器端用戶確實在做有效的事情。 (無論如何,在實踐中,你必須相信客戶有些滯後補償,並將一些不重要的東西卸載到客戶端)。

出於這個原因,JavaScript是不是用於開發在線遊戲,因爲每個動作確實需要處理,由服務器驗證的一個很好的語言。對於其他編程語言來說,這並不是一個很大的問題,因爲您可以使用TCP/IP爲服務器和客戶端構建自己的通信協議。但是,對於JavaScript而言,不存在這種可能性,因爲您必須依賴HTTP協議和XMLHTTPRequest處理程序,這些處理程序會導致非常低效的實時客戶機 - 服務器通信。

就像你說的,你總是可以做到的接口在JavaScript,但爲了安全,你仍然需要在服務器端執行大量的東西,這肯定不適合需要更注重動作控制遊戲作品。所以,如果你需要安全性的話,你幾乎只限於回合制遊戲。

+0

感謝您的完整答案:) 我想我會堅持輪流轉,然後機會遊戲。 – rnaud 2010-03-30 09:16:23

1

不,沒有辦法。
將用戶操作發送到服務器有什麼問題?

+1

嗯,我」我正在考慮移動和低連接,我希望避免每半秒鐘加載一次。 – rnaud 2010-03-30 09:09:57

2

你可以做一些東西來阻止天真的用戶,但可能不是每個人。這一切都取決於這個人如何激發你的遊戲「攻擊」。在一天結束時,用戶可以使用JavaScript調試器來查看代碼正在執行的操作,並複製它。即使你發回每場比賽的動作,用戶仍然可以複製該動作。如果您不小心用戶可以執行什麼操作,他們可能能夠發回不可能執行的操作,如果他們使用默認控制方案來控制遊戲。

2

不應該有勝利的URL。在遊戲過程中,客戶端應該發送用戶操作,如果他們贏了,服務器會將它們重定向到勝利頁面。

沒有計算/回報應該勝利頁面上完成,如果有的話。

1

這會被視爲一種選擇嗎? (延遲迴答)

將關鍵的東西(不想被黑客攻擊的東西)轉移到隱藏的內部閃存播放器上,該閃存播放器既充當關鍵變量存儲,計算器(例如:生活點)和「通信器」到這些遊戲數據的服務器。

這肯定比JavaScript更安全。但仍然;總是最好假設你的客戶端是100%不安全的。 (即使在C++遊戲,笑:黑客)

然而,通過轉移業務的遊戲數據閃存,你可以利用它的一些更有趣的通信功能,如:P2P =)

+0

這是一個非常有趣的選項,我從來沒有想過。我沒有太多的AS知識,但這將如何工作? – 2011-07-07 20:31:55

+1

@Angelo R.鏈接有關於將AS3鏈接到JS的更多詳細信息:http://www.hardcode.nl/archives_155/article_334-call-javascript-function-from-as3-and-viceversa。簡而言之,雙方都可以相互進行函數調用。通過強制,重要的數據流量通過閃存運行,因此也是服務器。您可以將Flash轉換爲與服務器同步的'安全'變量存儲器,並將javascript作爲「數據顯示」。但是:請注意,閃存不是100%的傻瓜證明,但與Javascript相比,反編譯確實更難。 – PicoCreator 2011-07-08 00:34:28

+0

感謝你們,這將是一個有趣的閱讀..並可能項目 – 2011-07-08 21:01:58