サーバーは王様です。クライアントはハッキング可能です。
あなたがしたいことはあなたの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を編集することを許可しないでください。