JavaScript を使用して HTML5 ゲームを作成しているとします。変数は、、<canvas>
などの DOM に格納されます。level
exp
current_map
明らかに、それらは Firebug を使用してクライアント側で編集できます。セキュリティを最大化するにはどうすればよいのでしょうか?編集 (およびチート) が非常に難しくなりますか?
JavaScript を使用して HTML5 ゲームを作成しているとします。変数は、、<canvas>
などの DOM に格納されます。level
exp
current_map
明らかに、それらは Firebug を使用してクライアント側で編集できます。セキュリティを最大化するにはどうすればよいのでしょうか?編集 (およびチート) が非常に難しくなりますか?
妥当なレベルのセキュリティが必要な場合は、変数をDOMに保存しないでください。JavaScriptは、難読化されていても、簡単にリバースエンジニアリングできます。これにより、ローカルの暗号化メカニズムが無効になります。
キー変数をサーバー側に保存し、httpsを使用してセキュリティを最大化します。それでも、クライアントコード(JavaScript)はハッキングに対して非常に脆弱です。
クライアントに存在するものはすべて変更できます。これは、MMORPGではキャラクターのデータがサーバー上に存在するため、プレーヤーはメモリツールや16進エディターなどを使用してキャラクターをハッキングできないためです(実際には「可能」ですが、サーバーがキャラクターのデータの正しいバージョンを保持しているためです)役に立たない)。
良い例はDiablo2です。実際には2つの異なるキャラクターがあります。1つはシングルプレイヤー用(および1つはサーバーである他のプレイヤーとネットワークでプレイ)、もう1つはBattle.net用です。最初のケースでは、人々はキャラクターのレベルとポイントを「ハッキング」して、その場でメモリを編集したり、16進エディタでキャラクターファイルを編集したりすることができます。しかし、Battle.netで使用していたキャラクターではそれは不可能でした。
もう1つの簡単な例は、回答する時間が限られているクイズです。クライアント側ですべてを処理する場合、プレーヤーはそれをハッキングして経過時間を変更し、常に最高のスコアを取得する可能性があります。したがって、タイムスタンプもサーバーに保存し、その値を比較として使用して回答を得る必要があります。
要約すると、JavaScript、C ++、アセンブリのいずれであるかは関係ありません。ルールは常に「クライアントに依存しない」です。ゲームデータのセキュリティが必要な場合は、クライアントがアクセスできないもの、つまりサーバーを使用する必要があります。
Object.freeze
または、ポリフィルまたは非表示を行うフレームワークを使用できます。
http://netjs.codeplex.com/をチェックしてください
オプションで、ある種の署名システムを実装することもできますが、実際に侵入できないものはありません。たとえば、オブジェクトがロックされているObject.freeze
かObject.watch
、メモリ内で手動で変更できます。
最終的に本当に何を達成しようとしていますか?
あなたができることは、ゲームのマトリックスまたはゲーム自体の表現、または特別なハッシュまたは両方の組み合わせを送信し、サーバーでスコアを集計することです...ユーザーはスコアを変更するだけでなく、ゲームの状態を正しく変更します。
サーバー側のゲーム ロジック
サーバー上に機密データを保持し、ブラウザ上に表示目的のみのローカル コピーを保持する必要があります。次に、これらの値を変更するすべてのアクションについて、サーバーがそれらの検証を担当する必要があります。たとえば、プレーヤーがパズルを解く必要がある場合、ソリューションのクライアント側を検証する必要はありませんが、たとえば、文字列として表される順序付けられたピースのハッシュ値をサーバーに送信して、ハッシュ値が正しいことを検証します。次に、プレイヤーの経験値/レベルを上げて、情報をクライアントに送り返します。