web-dev-qa-db-ja.com

ゲームにWebSocket(WS)またはセキュアWebSocket(WSS)を使用する必要がありますか?

ゲームを作成していて、通信の99%にWebSocketを使用しています。唯一のhttpは、初期ページの読み込み時とログイン/登録時です。

私は完全に初心者なので、間違っていても正解ですが、SSLは中間者攻撃を防ぐためだけのものですよね?私がwebsocket経由で送信するパケットはどれも「機密」ではありません。ほとんどが[packetName、xCoord、yCoord]です。私が送信しているゲームパケットは、サードパーティがそれらを手に入れたかどうかが問題になる場所で考えることはできません(その人が同じ部屋で同じゲームに参加していたとしても、誰もがいつでも他の全員を見ることができるため)ゲーム)。

通常は常にSSLを使用することがベストプラクティスであると考えられていますが、ゲームではクライアントとサーバー間で大量の通信が行われます(1秒あたりの位置更新が多く、遅延/帯域幅/処理をできるだけ少なくしたい)。必要かしら?

Wssを有効にしない場合に発生する可能性がある最悪の事態は何ですか?

6
Chron Bag

(下部のtl; dr)

この時点では、ダイヤルアップ接続であっても暗号化は基本的に無料です。ほぼすべての主要言語に組み込み、またはライブラリがあります。TLS/ SSLを使用しないことの利点は、2回目の起動時間のごく一部であり、CPU使用量のごくわずかな削減(小さなパーセントの割合)、および節約された帯域幅の約4kb セッションごと(TLSは、初期ハンドシェイク後の帯域幅にそれほど影響を与えません)。したがって、ゲーム全体で接続を開いたままにしておくと、何も節約されません。

ただし、データを平文で送信すると、ゲームをいじりたい人がゲームの内容を簡単に確認できるようになります。彼らはあなたのプロトコルが何であるかを知ったら、彼らはそれを彼らの利益のために使うことができます。あるタスクを実行するために設計されたツールを使用している人は、常にそのツールを持っていない人よりも優れています。私はさりげなく考えて、ボッティング、ハイスコア操作、誤ったクライアントの更新、ツールによるプレイ、セッションのハイジャックを思いつきました。

たとえば、ボッティングとは、コンピュータに再生させることです。コンピュータは、100万回の動きを事前に予測できるので、ほとんどの場合、人間よりも速く、あらゆる状況で正しい間違いのない動きを選択できます。これは、彼らが勝つことを意味し、実際のプレーヤーは敗北します。つまり、最終的には、ゲームが放棄されるか、ボットがお互いに遊ぶだけでいっぱいになります。

ハイスコ​​アは人にとって物事を意味します。自我の問題です。したがって、彼らがプレーして250のスコアを取得し、トッププレーヤーのスコアが4,294,967,295であることがわかると、プレーに迷惑をかけることはありません。たとえば、ハイスコアコードに壊れやすいプロトコルが含まれている場合に発生する可能性があります(実際、一部のゲームは実際にはハイスコアを報告し、サーバーはそれを受け入れるだけです)。その部分は改ざんから保護する必要があります。

誤ったクライアントの更新は問題となる場合とそうでない場合がありますが、基本的には、クライアントに「嘘」をつけて、ゲームが実際とは異なる状態にあると思わせることができるかどうかにかかっています。たとえば、人々が地図上の間違った場所に表示されたり、サーバーが入力を検証せずに座標を受け入れるため、人々は「魔法のように」テレポートすることができます。暗号化を使用してこれを行うこともできますが、これは、独自のクライアントを作成するのではなく、バイナリ。

ツールアシストプレーはボッティングに似ています。その人はまだプレーしていますが、敗北した場合でもリアルタイムで最適な意思決定を行うためにツールによってガイドされます。ツールを使用する人は、通常、使用しない場合よりもパフォーマンスが良くなります(もちろん、いくつかの練習を想定しています)。これもまた、不正行為と見なされ、番犬の不足を検出してクライアントを保護することは不可能です。パケットを好きなように変更できれば、さらに簡単です。

セッションを表す接続の一部を把握できる場合、セッションハイジャックが発生する可能性があります。ご覧のとおり、TLS接続を暗号化されていない状態にダウングレードすることはできません(少なくとも、私にはわかりません)。つまり、接続を削除して新しい接続を開く必要があります。この新しい接続は、サーバーが誰であるかを識別する必要があります。確かに、ある種のトークンを使用できますが、それはナンス(1回の使用の値)にした方がよいでしょう。そうしないと、攻撃者はセッション情報を知って、おそらく接続を再生することによって、正当なクライアントを続行できないように仕向けることができます。サーバーなど.

全体として、常にTLSを使用する必要があります。三目並べやコネクトフォーのゲームであっても。誰かがどこかであなたのゲームをだまそうとするでしょう、そしてあなたは基本的に安全なチャンネルを有効にすることで不正行為のクラス全体を防ぐことができます。ほんのわずかな初期費用を除いて、暗号化は基本的に無料であるため、暗号化を使用しないことには実質的なメリットはありません。安全に認証している場合は、スタートアップの代金をすでに支払っているので、後で安全でないチャネルに切り替えることは意味がありません。

11
phyrfox

製品ではセキュアなWebSocketsプロトコルを使用する必要があります。


ゲームの詳細について提供した(非常に少ない)情報*。質問に対する一般的な回答のみが可能です**

Wssを有効にしないと、最悪の場合どうなりますか?

一般的なセキュリティ対策を無視してシステムを設計および構築する場合:

  • せいぜい何も起こりません。

  • 次に、完全に灰色の領域があり、機会を失うことになるか、最初の決定を補うために過剰なリソースを割り当てる必要があります。

  • 悪いことに-起こり得る悪いことには制限がありません。


* 暗号化されていない通信を使用することの影響を、ゲームが何であるかを完全に知らないで評価することは不可能です。特に:ゲームをどのように活用していますか?ユーザー同士が対戦していますか?ユーザーはチートに動機づけられていますか(実質的またはスコア表の形式で)?そのような分析に必要な情報には、ゲームの将来の開発、たとえば、それがキャッチされ、モデルを無料から変更し、将来的に資産化することにした場合の対処法も含まれます。

** 製品で暗号化されていない通信を使用することで起こりうるすべての危険性の監査では、適切な暗号化技術を実装するコストをすぐに超えるほど多くの要因を考慮する必要があります。

2
techraf