2010-12-20 9 views
6

リリース予定のIDEで書かれたHTML5/Javascriptゲームのオンラインアーケードを開発しています。オンラインアーケードハイスコアボードの不正行為を防止する

ゲームは、人々がこれらのゲームをプレイするときに、スコアを記録するためにサーバーに対してAjaxリクエストを使用します。

理論的には、高得点、ゲームコード、すべてを記録するコードの仕組みを含む、この設計を完全に制御できます。

このようなクライアント側のゲームをハックすることや高得点を偽ることは決して不可能ではないことを知っていますが、十分に能力のある誰もそれを行うのに十分気にならないようにしています。

私が読んだ:

How can you prevent bogus high scores from appearing on a global high score list?

を、これはHTML/JSの特定であるとして少し別の質問はどれ。

私の最初のアイデアは、リクエストのソースが正しい場所から来たものかどうかを確認することです。これは、ほとんどのハッキング試行のための単純で効果的なブロックです。

+2

申し訳ありませんが、正しい場所は他のパラメータと同じようになりすますことができます。ユーザーサイドスクリプト(Greasemonkeyのような)でかなり簡単です - クライアント側のコードにコードを追加するだけで、それでもあなたのページ(場所)から実行されます – Konerak

+0

これは残念です! –

答えて

3

これまでの回答では、クライアントを信頼できないと述べていたため、ゲームをある種のレベルに分割し、サーバーの制御レベルを進化させることをお勧めします。サーバーが各クライアントとその進行状況を追跡している場合、達成可能なスコアの範囲を制限する可能性があります。これにより、クライアントが各レベルのシミュレーションを行い、正しいスコアの範囲内で達成度を示すために、チートを行うのがより面倒です。

2

を実装するのはかなりシンプルですが(簡単ではありません)、ハックするのがとても簡単ではなく、 をハックするのは非常に難しいです。

サーバー側では、テキストファイルまたはデータベースのいずれかに1000個のアイテムが格納されているとしましょう。

各項目は一意のGUIDまたはその他の固有の長い文字列になります。それぞれの項目をkeyと呼びます。

今、AJAXリクエストを送信すると、それらのキーの1つも送信されます。リストからランダムにすることも、インデックスをインクリメントすることもできます。

各鍵の1回の "使用"後(サーバーがその鍵で要求を出してそれに応答したことを意味します)、ファイル/データベースから鍵を削除します。サーバーがリストに存在しないキーでリクエストを取得した場合は、もちろんエラーをスローするか、「ハッキングなし」の文字列を返します。

リストが空になったら、新しくユニークなキーで再作成してください。

このようにして、実際のキーを持つ最初の要求は通常どおり成功するはずですが、ユーザーが同じ要求に対して正確に再度呼び出しを試みると失敗します。キーを推測することは、それらが長いランダム値であると仮定すると非常に困難です。

他の方法と同様に、それは方法を知っている人が偽装する可能性があるクライアント側のコードによって、欠陥があります。しかし、それが一般的ではないので、一般の人々がこの仕組みを見つけてそれをハックするのは難しいでしょう。

+0

これはどのように安全にすることができないのか分かりません。つまり、偽のクライアントが偽の上級者を送るのを防ぐのはどういう意味ですか?編集:または少なくとも、どのようにそれは難しいですか? – ybo

+0

@ybo:クライアントは任意のスコアを送信できますが、有効なキーがないとサーバーはそれを無視します。 –

+0

クライアントはどのキーを送信する必要があるのか​​、クライアントはどのように知っていますか?それはクライアント側から計算されなければならないので、それは偽造することができます... – acm

2

これはすべてのゲームでは機能しませんが...

すべての制御入力をすべてのフレームに記録し、レベルの先頭にRNGシードを記録すると、コントローラ入力を再生してレベルを再実行し、まったく同じ一連のイベントを取得することができます。これは、ゲームが実際にプレイされ、スコアがちょうど作られたのではないことを確認するために使用することができます。すべてのゲームを検証するのには費用がかかりますが、他のオプションもあります。スコアがトップ100にある場合にのみゲームを検証するか、ランダムゲームをテストし、検証が失敗した場合はアカウントを無効にします。

そして、チーターがロボットを使って遊んでいるのを見て、それを見守ってください。そのため、守るのはさらに難しくなります。

1

ハイスコアコードのmd5ハッシュを追加し、サーバー上で比較します。しかし、最高得点のmd5を正確にはしないでください。最高得点のすべての文字ではなく、文字のうちのいくつかのみを使用してください。この場合、ajax呼び出しをトレースするだけで、md5の構成を確認することは難しくなります。

+1

しかしこれは、以前に生成されたハッシュでリクエストを送信することによって、他のユーザーが同じスコアを得ることを可能にします。 –

3

ページを提供するたびに、ランダムに生成されたキーが含まれ、サーバー上でキーをユーザーセッションに関連付けます。

このキーを渡し、ゲームスクリプトのさまざまなポイントであいまいな方法で操作します。

スコアと操作されたキーから派生したチェックサムを生成します。

はそれが専用のハッカーを停止することはありませんスクリプト

を難読化サーバー

のチェックサムを検証スコア

と一緒にサーバにチェックサムを送信します。

+2

実際に専用のハッカーを止めることはありません。チェックサムを発行する前にハイスコア変数を変更して送信するだけです。 – Konerak

関連する問題