3

ゲームの大部分がJavaScriptで書かれているオンラインゲームを作り始めています。セキュリティの観点から、FireBugのようなツールを使用すると、ゲームのプレーヤーがJavaScriptを簡単に操作し、ゲームが意図していないことを実行できることに気付きました(たとえば、キャラクターが2倍の高さまでジャンプできるようにします)。

スコアをスコアボードに公開する機能を設定すると、さらに悪化します。プレーヤーは不正確なスコアを取得できるだけでなく、スコアがサーバーにどのように投稿されるかを理解した場合、FireBugからAJAX呼び出しを作成して、必要なスコアを公開できます。

この特定の問題はゲームにありますが、主要な問題は、他の多くのWebアプリケーションに適用できるJavaScriptセキュリティにあります。

4

4 に答える 4

3

いいえ、それは絶対に不可能です。

難読化を使用することができ、AJAXを本当に醜くすることができ、最終的には、使用するクライアント側のセキュリティを回避するのに最大5分かかります。

スコアリングなど、セキュリティに関連するサーバー側のチェックを行う必要があります。これを行う方法は、実装によって異なります。

于 2012-05-03T02:25:33.483 に答える
3

コードが通常のWebブラウザーで実行されている場合、必要に応じてコードを保護することはできません。ただし、イベントサーバー側を検証して、実行されているアクションが「意味のある」ものであることを確認し、ユーザーが高得点などを送信できないようにすることができます。もちろん、これは重要な方法でプログラミングを複雑にします。

于 2012-05-03T02:25:51.593 に答える
2

たくさんのチェックをしてください。最大ジャンプの高さが5ブロックの場合は、サーバーが5を超えるジャンプを受け入れていないことを確認してください。

私がゲームを作るとき、私はすべてのものをチェックします。ユーザーがその特定のことをハッキングするために何かをする可能性が1%あるとしても、それは保護されています。

于 2012-05-03T02:52:20.123 に答える
-1

はい、ゲームを保護できます。たとえば、詐欺師に方向を間違える非常に難しいパズルを解かせることによって。

コンテキストの例

javascriptに完全に依存し、サーバー側のゲーム状態がないゲームを考えてみましょう。ゲーム中にポイントが収集され、ゲームの終了時に、これらのポイントがサーバーに送信されて、プレーヤーがリーダーボードに配置されます。

リーダーボードの問題

ゲームの最も重要な部分は、誰かがネットワークトラフィックを監視し、必要に応じて変更できることです。サーバー上でゲームの状態を維持することで、ゲームの他のすべての側面を防ぐことができますが、それは私の答えの範囲外です。

「セキュリティキー」の実装

次のようなjavascriptオブジェクトのポイントを追跡することを検討してください。

results = [
    {score: 12, epoch_ms: 15236543784, security_key: 6b42535e89f7fb1cc5abbe53d267ee0e},
    {score: 4, epoch_ms: 15236542565, security_key: 8af02a3d473d6b9c0a0362cfa59567d8},
    {score: 5, epoch_ms: 15236564511, security_key: 40f6611ff3156d935f420eb746ac897f}
];

サーバー側では、security_keyパケット全体でチェックされます{score: ?, epoch_ms: ?}失敗した場合は、サーバーから「エラー。セキュリティキーが正しくありません。次回これが発生すると、不正行為によりアカウントが禁止されます。」というメッセージがサーバーから返されます。「ユーザーが常に新しいアカウントを作成できないようにする方法は範囲外です。この答えの、しかしこれを行うための確かに非常に良い方法があります。

セキュリティキーを生成する方法

を生成するコードは次のsecurity_keyようになります。

result.security_key = your_over_the_top_complicated_algorithm(result, md5(result));
...
function your_over_the_top_complicated_algorithm(result, seed)
{....}
...

現在、は、security_key非常に長い正規表現などを使用する、非常に難読化された複雑なアルゴリズムで作成されています。それがどのように機能するかを理解しようとしている人は、それを正しく理解するのに少なくとも1週間かかることを確認してください(アルゴリズムを毎週根本的に更新して、リバースエンジニアリングをさらに促進することができます)。

このコードを機能させるには、使用するハッシュアルゴリズム(md5.js)を実装する既存のライブラリも含める必要があります。ライブラリが別のファイルである限り、これらのハッシュの使用を複雑なアルゴリズムに埋め込むこともできます。

だまされた

秘訣は、詐欺師がその複雑なアルゴリズムを打ち負かす方法を決定しようとしているときresultに、のような外部の縮小ハッシュ関数への参照として渡されるときですmd5。ただし、外部md5関数は実際には独自の修正バージョンであるため、少しコードを追加しました。これにより、result.epoch_ms値のエポックの精度が犠牲になり、スコア(および場合によっては結果オブジェクト内の他の要素)に基づいてハッシュが格納されます。 )。

例えば。が「」epoch_msに等しく、「15236564511」である場合。次に、ラインに沿ってどこかを呼び出して、非常に複雑な関数のシードとして機能するようにします。しかし、その間、その外部md5コードでは...score5md5(result)

 function md5(r)
 {
     ...
     r.epoch_ms=(r.epoch_ms+'').slice(0, -2)+(1234.56*r.score+'').slice(1,3);
     // or obfuscated (to prevent searching for terms like 'epoch_ms'):
     var _0x5da4=["\x65\x70\x6F\x63\x68\x5F\x6D\x73","\x73\x6C\x69\x63\x65","","\x73\x63\x6F\x72\x65"];r[_0x5da4[0]]= (r[_0x5da4[0]]+ _0x5da4[2])[_0x5da4[1]](0,-2)+ (1234.56* r[_0x5da4[3]]+ _0x5da4[2])[_0x5da4[1]](1,3)
     ...
 }

の最後の2つの数値が、epoch_msに基づく単純なハッシュと一致しない場合、サーバーは、が無効であるscoreかのように同じエラーを返します。security_keyこれは、誤った方向性の本質的な部分です。

注意してください

このアプローチは簡単に実装できます。トレードオフはありません。問題は、このパズルの解決策が目に見えないところに隠されていることです。誤った方向が失敗し、誰かがmd5.jsファイルを調べての使用法を探すとすぐにr、それは「ゲームオーバー」です。

また、私はこれを自分で作成したばかりであり、これがjavascriptベースのWebゲームで詐欺師を止めるのに十分であるかどうかについての個人的な経験がないことにも注意してください。私はこのアプローチの大きな弱点を見落としていたかもしれません。弱点を見つけたらコメントしてください、それは未発達のアイデアなので、いいです:)

これは暗号的に安全ではなく、すべてのアンチチートシステムと同様に、最終的に誰かがそれを理解するでしょう。秘訣は、最小限の実装作業で可能な限り困難にすることだと思います。

これは比較的単純な例ですが、十分な難読化、ステガノグラフィ、厳格な禁止ポリシー(詐欺師は最初の試行で間違いを犯す可能性があります)、さらなる改善、および実装の単純さを備えているため、取った。md5-関数を使用してコードを非表示にすることは、多くのバリエーションの1つにすぎません。あなたは潜在的な詐欺師を誤った方向に向け、やる気を起こさせるための多くの異なる方法を考えることができます。

それはあなたの家への強化されたドアのようなものです。彼らはもはやドアを蹴るだけではなく、入るためにより多くの時間を費やす必要があります。

于 2017-07-26T18:32:01.900 に答える