これは、インターネットゲームやコンテストの典型的な問題です。Flashコードはユーザーと連携して、ゲームのスコアを決定します。ただし、ユーザーは信頼されておらず、Flashコードはユーザーのコンピューターで実行されます。あなたはSOLです。攻撃者がハイスコアを偽造するのを防ぐためにできることは何もありません。
バイトコードは十分に文書化されており、高級言語(Actionscript)を記述しているため、Flashのリバースエンジニアリングは想像以上に簡単です。Flashゲームを公開するときは、ソースコードを公開するかどうかに関係なく、それを知っているかどうか。
攻撃者はFlashインタープリターのランタイムメモリを制御するため、プログラム可能なデバッガーの使用方法を知っている人はいつでも変数(現在のスコアを含む)を変更したり、プログラム自体を変更したりできます。
システムに対する最も単純な攻撃は、ゲームのHTTPトラフィックをプロキシ経由で実行し、ハイスコアの保存をキャッチして、より高いスコアで再生することです。
各ハイスコアセーブをゲームの単一インスタンスにバインドすることで、この攻撃をブロックすることができます。たとえば、ゲームの起動時に暗号化されたトークンをクライアントに送信すると、次のようになります。
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(同じ効果でセッションCookieを使用することもできます)。
ゲームコードは、このトークンをハイスコア保存でサーバーにエコーバックします。ただし、攻撃者はゲームを再度起動してトークンを取得し、すぐにそのトークンを再生されたハイスコアセーブに貼り付けることができます。
したがって、次に、トークンまたはセッションCookieだけでなく、ハイスコア暗号化セッションキーもフィードします。これは128ビットのAESキーであり、Flashゲームにハードコードされたキーで暗号化されています。
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
ゲームがハイスコアを投稿する前に、ハイスコア暗号化セッションキーを復号化します。これは、ハイスコア暗号化セッションキー復号化キーをFlashバイナリにハードコーディングしたために実行できます。ハイスコアのSHA1ハッシュとともに、この復号化されたキーを使用してハイスコアを暗号化します。
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
サーバー上のPHPコードは、トークンをチェックしてリクエストが有効なゲームインスタンスからのものであることを確認してから、暗号化されたハイスコアを復号化し、ハイスコアがハイスコアのSHA1と一致することを確認します(この手順をスキップした場合) 、復号化は単にランダムな、おそらく非常に高い、高いスコアを生成します)。
そのため、攻撃者はFlashコードを逆コンパイルし、AESコードをすばやく見つけます。これは、親指のように突き出ていますが、そうでない場合でも、メモリ検索とトレーサーを使用して15分で追跡されます(「私は知っていますこのゲームの私のスコアは666なので、メモリ内で666を見つけて、その値に触れるすべての操作をキャッチしましょう---ああ、ハイスコア暗号化コードです!」)。セッションキーを使用すると、攻撃者はFlashコードを実行する必要さえありません。彼女はゲーム起動トークンとセッションキーを取得し、任意のハイスコアを送り返すことができます。
あなたは今、ほとんどの開発者が諦めているところです---次の方法で攻撃者をいじくりまわすか、数か月かかります。
これはほとんど時間の無駄です。言うまでもなく、SSLも役に立ちません。2つのSSLエンドポイントのいずれかが悪である場合、SSLはユーザーを保護できません。
ハイスコア詐欺を実際に減らすことができるいくつかのことがあります:
ゲームをプレイするにはログインが必要であり、ログインでセッションCookieを生成し、同じセッションで複数の未処理のゲームを起動したり、同じユーザーに対して複数の同時セッションを許可したりしないでください。
これまでにプレイされた最短の実際のゲームよりも長く続くゲームセッションからのハイスコアを拒否します(より洗練されたアプローチについては、平均ゲーム期間より2標準偏差未満続くゲームセッションのハイスコアを「隔離」してみてください)。サーバーサイドでゲームの継続時間を追跡していることを確認してください。
ゲームを1回または2回しかプレイしていないログインからのハイスコアを拒否または隔離するため、攻撃者は、作成するログインごとに、合理的な外観のゲームプレイの「紙の証跡」を作成する必要があります。
ゲームプレイ中の「ハートビート」スコア。これにより、サーバーは1つのゲームプレイの存続期間にわたってスコアの増加を確認できます。妥当なスコア曲線に従わないハイスコアを拒否します(たとえば、0から999999にジャンプします)。
ゲームプレイ中の「スナップショット」ゲームの状態(たとえば、弾薬の量、レベル内の位置など)。これは、後で記録された中間スコアと照合できます。そもそも、このデータの異常を検出する方法さえ必要ありません。あなたはそれを集める必要があります、そしてそれからあなたは物事が怪しげに見えるかどうかそれを分析することができます。
セキュリティチェックの1つに失敗したユーザーのアカウントを無効にします(たとえば、検証に失敗した暗号化されたハイスコアを送信するなど)。
ただし、ここではハイスコア詐欺を阻止しているだけであることを忘れないでください。もしそうなら、あなたが防ぐことができることは何もありません。あなたのゲームにお金があれば、誰かがあなたが思いついたシステムを打ち負かすでしょう。目的は、この攻撃を阻止することではありません。それは、単にゲームを上手くやってそれを打ち負かすよりも、攻撃をより高価にすることです。