33

スクロールレベルのあるスペースシューターを想像してみてください。悪意のあるプレーヤーがゲームを自分たちの利益のために変更するのを防ぐためにどのような方法がありますか?サーバー側を制限するのが難しい彼ができることは、自動照準、可視領域の外側の覗き見、スピードハッキングなどです。

これを防ぐにはどのような方法がありますか?サーバーは任意の言語であり、クライアントはWebSocketを介して接続されていると想定します。

コードは100%ハッキング可能であると常に想定してください。(不正行為の目的で)完全に書き直されたクライアントが不正行為をしないようにする方法を考えてください。これらは、安全なゲームプロトコルを作成する方法、サーバー側の検出などです。

4

9 に答える 9

37

サーバーは王様です。クライアントはハッキング可能です。

あなたがしたいことはあなたのwebsocketで2つのことです。

サーバーにゲームアクションを送信し、サーバーからゲームの状態を受信します。

ゲームの状態をレンダリングします。そして、サーバーに入力を送信します。

  • 自動照準-これは解決するのが難しいです。あなたはリアリズムのために行かなければなりません。ユーザーが10ミリ秒で10ヘッドショットを打った場合、あなたは彼を蹴ります。巧妙なチート検出アルゴリズムを作成します。
  • 可視領域の外側をのぞく-可視領域を各クライアントに送信するだけで解決
  • ハッキングの高速化-入力を正しく処理することで解決しました。ユーザーが前に進んだというイベントを受け取り、ユーザーの移動速度を制御します。

コードを縮小してこれらの問題を解決することはできません。クライアントのコードは、入力と表示出力を処理するためだけにありますすべてのロジックはサーバー上で実行する必要があります。

サーバー側の検証を作成するだけです。唯一のことは、複雑さのために、ゲーム入力を検証してからフォーム入力を検証するのが非常に難しいということです。これは、フォームを安全にするために行うのとまったく同じことです。

ただし、「入力は有効」の検出には十分注意する必要があります。あなたはあなたのゲームから高度に熟練したプレーヤーを蹴ったり禁止したりしたくありません。ボットの検出が緩すぎることと、ボットの検出が厳しすぎることのバランスをとることは非常に困難です。ボット検出の領域全体は、全体的に非常に困難です。たとえば、Quakeには自動照準検出機能があり、合法的に熟練したプレーヤーをその日に蹴り返しました。

ボットがWebSocketに接続するのを阻止することに関しては、セキュリティを強化するために、マルチプレイヤーゲームに個別のHTTPまたはHTTPS検証チャネルを直接設定します。複数のHttp/https / wsチャネルを使用して、クライアントが「公式」であり、何らかの形のハンドシェイクとして機能していることを検証します。これにより、wsへの直接接続が難しくなります。

例:

単純なマルチプレイヤーゲームを考えてみてください。2Dルームベースのレーシングゲーム。最大n人のユーザーがフラットな2Dプラットフォーマーマップにアクセスし、AからBに移動するために競争します。

議論のために、HTTPSチャネルを介して複雑な認証が行われ、ユーザーがWebSocketチャネルに直接アクセスできず、ブラウザーを経由することを余儀なくされる、絶対に安全なシステムがあるとします。認証を処理するChrome拡張機能があり、ユーザーにそれを使用するように強制する場合があります。これにより、問題のあるドメインが減少します。

サーバーは、クライアントが画面をレンダリングするために必要なすべてのビジュアルデータを送信します。このデータを隠すことはできません。何をしようとしても、愚かなハッカーはコードを取得し、デバッガーでコードを編集する際に速度を落とすことができます。彼はあなたに認証全体を実行させますが、あなたが書いたJavaScriptが彼の実行を阻止するのを阻止するために、彼にできることは何もありません。それで達成できるのは、WebSocketにアクセスするのに十分なスキルを持つハッカーの数を制限することだけです。

これで、ハッカーはWebSocketをクロームサンドボックスに入れました。彼は入力を見ます。もちろん、あなたのレースコースは動的かつユニークに生成されます。あなたがそれらの設定された量を持っていれば、ハッカーは最適なレースルートを事前に設計することができます。このマップを視覚化するために送信するデータは、ゲームとの人間の相互作用よりも速くレンダリングでき、レーシングゲームに勝つための最適な動きを計算してサーバーに送信できます。

マップデータに反応が速すぎるプレーヤーを禁止してボットと呼ぶ場合、ハッカーはこれを調整して遅延を追加します。完璧にプレイしすぎるプレイヤーを禁止しようとすると、ハッカーはこれを調整し、ランダムな数字を使用して完璧とは言えないプレイをします。アルゴリズムボットのみが該当するトラップをマップに配置する場合は、試行錯誤または機械学習アルゴリズムを通じて、それらについて学習することでトラップを回避できます。絶対に安全にするためにできることは何もありません。

ハッカーを絶対に回避するための選択肢1つだけです。それは、ハッキングされない独自のブラウザを構築することです。ブラウザにセキュリティメカニズムを組み込みます。ユーザーが実行時にリアルタイムでJavaScriptを編集することを許可しないでください。

于 2011-03-09T18:51:49.427 に答える
3

サーバー側には、次の2つのオプションがあります。

1)完全なサーバーサイドゲーム

各クライアントは、「アクション」をサーバーに送信します。サーバーはそれらを実行し、関連するデータを送り返します。たとえば、船が北に移動したい場合、サーバーは新しい位置を計算して送り返します。サーバーは、表示されている船のリスト(maphacksを解決する)なども送信します。

2)完全なクライアントサイドゲーム

各クライアントは引き続きアクションをサーバーに送信します。ただし、サーバーの作業負荷を軽減するために、サーバーはアクションを実行せず、他のすべてのクライアントにアクションを転送します。その後、クライアントはすべてのアクションを同時に解決します。結果として、各クライアントは同じゲームで終わるはずです。定期的に、各クライアントは絶対データ(船の位置など)をサーバーに送信し、サーバーはすべてのクライアントデータが同一で​​あるかどうかを確認します。そうしないと、ゲームが同期しておらず、誰かがハッキングしている必要があります。

2番目の方法の欠点は、一部のハックが検出されないままになることです。たとえば、maphackです。詐欺師はコードを挿入してすべてを見ることができますが、それでも通常は見ることができるはずのデータのみをサーバーに送信します。

-

クライアント側には、1つのオプションがあります。ゲームコードをスキャンして、何かが変更されているかどうかを確認するjavascriptコンポーネント(たとえば、表示されていないが異なる検証データをサーバーに送信するオブジェクトをレンダリングするようにコードが変更されている)。

明らかに、ハッカーはこのコンポーネントを簡単に無効にすることができます。これを修正するには、クライアントにサーバーからコンポーネントを定期的にリロードするように強制できます(サーバーは、スクリプトファイルがユーザーから定期的に要求されたかどうかを確認できます)。これにより、新しい問題が発生します。ハッカーはAJAXを介してコンポーネントを定期的に要求しますが、実行できません。これを回避するには、コンポーネントにそれ自体を再ダウンロードさせますが、それ自体のバージョンを少し変更します。

例:コンポーネントをyoursite / cheatdetect.js?control=5に配置します。サーバーはわずかに変更されたcheatdetect.jsを生成するため、次の反復でcheatdetect.js?control = 22(たとえば)をダウンロードする必要があります。制御メカニズムが十分に複雑な場合、ハッカーは次に要求する制御番号を予測できず、ゲームを続行するにはcheatdetect.jsを実行する必要があります。

于 2011-03-09T20:08:49.103 に答える
1

クライアント側のコードに触れる必要はありません。Websocketプロトコルをスニッフィングして実装し、人間のプレーヤーになりすました小さなエージェントを作成するだけです。

更新:問題にはいくつかの部分があり、頭の中で答えはありませんが、次の質問を念頭に置いてさまざまなオプションを評価できます。

  1. 不正行為を防ぐためにどこまで進んでいきますか?カジュアルな不正行為だけを気にする場合、カジュアルな不正行為を思いとどまらせるのに十分な障壁はいくつありますか?中級のJavascriptプログラマー?真面目な専門家?これを不正行為のメリットと比較すると、現金や賞品、または単に評判など、実際に価値のあるものはありますか?
  2. 人間がゲームに入力を提供しているという高い確信をどのように得るのですか?たとえば、十分なコンピュータビジョンライブラリがあれば、マウスを装ったコンピュータへの別のマシンフィード入力でゲームをモデル化できますが、これには高い相対コストがかかります(時間の価値はありません)。
  3. (2)の知識をサーバーに渡すことができ、サーバーがクライアントコードがメッセージを送信していることを比較的確信できるように、プロトコルに信頼の鎖を作成するにはどうすればよいですか?

Sure many of the roadblocks you throw up can be side-stepped, but what is the cost to the player and you? See "Attrition warfare".

于 2011-03-09T18:36:23.680 に答える
1

誰かがJSを変更したり、GreaseMonkeyスクリプトを記述したりするのを防ぐために実際にできることは何もありません。ただし、スクリプトを縮小し、コードを可能な限り不可解にすることで、彼らを困難にすることができます。たぶん、攻撃者を追い払うために使用されるだけの偽のメソッドや変数を投入することさえあります。しかし、十分な時間があれば、これらのメソッドはどれも完全に確実なものではありません。コードがクライアントに渡されると、それはもはやあなたのものではなくなるからです。

于 2011-03-09T18:31:53.600 に答える
1

これを実装することを考えることができる唯一の方法は、クライアントとして機能するようにJavascriptを変更し、そのクライアントから送信されたデータを検証する中央サーバーメカニズムを設計することです。これはおそらく実装するのに大きな変更であり、プロジェクトをより複雑にする可能性があります。ただし、前述のように、アプリケーションが完全にクライアント上で実行されている場合、クライアントはスクリプトを使用してほとんど何でも実行できます。信頼できるマシンを使用して検証を処理するためにそれを保護する唯一の方法。

于 2011-03-09T18:43:34.450 に答える
1

実装できる他のいくつかのメソッド:

  • スクリプトが他の要素と区別しにくいようにターゲット要素を作成します。可能であれば、予測可能なクラス名とID名を持つdivは避けてください。クラスを使用する代わりにJavaScriptを使用してスタイリングを挿入します。ハッカーのように考えて、自分自身を苦しめましょう。
  • スクリプトが起動するおとりを使用します。たとえば、脅威ベクトルがピクセルカラーを使用するスクリーンスクレイピングアルゴリズムである場合、非ターゲット要素にいくつかの一般的なピクセルカラーをスローします。これらの非ターゲットへのヒットは、詐欺師にとって重要ではないように見えるかもしれませんが、検出可能です。あなたは詐欺師にあなたが知っている理由を知られたくないのです。
  • アクション間の最小時間を人間の最高レベルよりわずかに低く制限します。最高のプレーヤーはその高原にぶつかり、だれがだましているのかはそれほど重要ではなく、メソッド呼び出しをサイドコールすることで、それよりも速くスクリプトを実行している人をすぐに検出できます。
  • 乱数ジェネレーターは通常、均一です。人間の本性はそうではありません。おそらく、乱数ジェネレーターは、設定された制限内の値と均等な分布を持ちます。自然分布はガウス曲線です。分布をサンプリングし、x軸とy軸の方形波のように見える場合、100%それは詐欺師です。これは、ランダム分布自体ではなく、ランダムの導関数であるため、詐欺師がアルゴリズムのしきい値を検出するのはかなり困難です。また、個々の再生ではなく集合データを使用して検出しているため、検出アルゴリズムを知らなければ、アルゴリズムのリバースエンジニアリングは非常に困難になります。
  • 可能な限りエントロピーを利用します。予測可能なゲームプレイは避けてください。レーストラックのセットコレクションでのレースゲームを想像してみてください。ゲームプレイごとに、牽引力、馬力、勢いのレベルがわずかに異なる可能性があります。スクリプトはそれを打ち負かすために非常に優れている必要があります。スクロールゲームでは、人間には本能的であるが、風力や重力の変化など、コンピューターでは難しい要素を変更できます。また、副次的なメリットとして、より楽しくなります。
  • サーバーで生成されたトークンは、コード自体の呼び出しではなく、使用されたUI要素を検証するために使用できます。検証は、ゲームの終了時に、イベントをUI要素のハッシュコードと比較する1回の呼び出しで処理できます。トークンは、サーバーの秘密鍵とUI要素の値を含むハッシュである必要があります。
  • 詐欺師を検出するために使用していると思われるデータで詐欺師をデコイします。偽のバックエンドへのダミー呼び出しを伴うDetectCheatメソッドの呼び出しなど。それは昔の魔術師のトリックです。もう一方の手でカードをデッキに滑り込ませながら、ここで手を振ってください。たくさんの髪を引っ張って、出口のない迷路で彼らに何日も無駄にさせてください。
于 2020-06-13T23:52:18.840 に答える
0

ミニファイとAJAXを組み合わせて使用​​します。すべての関数とデータがページにロードされていない場合、チートするのはより困難になります。

一方、モッディングはIdSoftwareのような企業にとって非常に有益なツールであることが判明しました。おそらく、システムの変更を許可することで、コミュニティ全体にとってゲームがはるかに楽しくなる可能性があります。

于 2011-03-09T18:37:24.453 に答える
0

クライアントに公開されたコードを可能な限り難読化します。さらに、いくつかの魔法を使用します。

于 2011-06-22T07:50:09.280 に答える
0

ブラウザでJavaScriptを編集して、機能させることができます。サーバーに確認するために電話をかけることを提案する人もいます。したがって、サーバーを呼び出した後、サーバーで検証されます。検証されると、クライアント側に到達してアクションを実行します。しかし、これでも絶対確実ではないと思います。

たとえば、。基本的なログインアクションの場合:サーバーへの呼び出し中にAngularで、バックエンドはユーザー名とpwdを検証し、検証された場合、クライアントに戻って、ユーザーがAngularを使用してログインできるようにします。

Angularを使用してログインすると言うと、ユーザーオブジェクトなどのCookieに保存されます。ただし、ユーザーはバックエンドを呼び出しているJSコードを削除し、TRUE(必要な場合)を返し、ユーザーオブジェクト(ダミー)をCookieやその他のオブジェクト(必要なもの)に挿入してログインできます。それは非常に難しいことですが、実行可能です。多くのシナリオでは、コードの編集/ハッキングに数時間かかる場合でも、これは望ましくありません。

これは、JSファイルがページごとにリロードされないシングルページアプリケーションで可能です。ハッキングされる可能性を軽減するために、縮小されたコードを使用できます。そして、このようなアクションがバックエンドで行われる場合(Djangoでのログインなど)、はるかに安全だと思います。

私が間違っている場合は訂正してください。

于 2016-02-17T09:41:50.203 に答える