これはインターネットゲームやコンテストの典型的な問題です。Flashコードはユーザーと連携して、ゲームのスコアを決定します。しかし、ユーザーは信頼されておらず、Flashコードはユーザーのコンピューターで実行されます。あなたはSOLです。攻撃者がハイスコアを偽造するのを防ぐためにできることは何もありません。
Flashは、バイトコードが十分に文書化されており、高級言語(Actionscript)を記述しているため、想像以上にリバースエンジニアリングが容易です。Flashゲームを公開するときは、ソースコードを公開します。それを知っているかどうか。
攻撃者はフラッシュインタープリターのランタイムメモリを制御するため、プログラマブルデバッガーの使用方法を知っている人はいつでも(現在のスコアを含む)変数を変更したり、プログラム自体を変更したりできます。
システムに対する最も簡単な攻撃は、ゲームのHTTPトラフィックをプロキシ経由で実行し、ハイスコアのセーブをキャッチして、より高いスコアで再生することです。
たとえば、ゲームの起動時にクライアントに暗号化されたトークンを送信することで、次のような暗号化されたトークンを送信することで、各ハイスコアセーブをゲームの1つのインスタンスにバインドすることで、この攻撃をブロックできます。
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コードを実行する必要さえありません。彼女はゲーム起動トークンとセッションキーを取得し、任意のハイスコアを送り返すことができます。
これで、ほとんどの開発者はあきらめます---次のようにして、攻撃者に2か月間あざけるか、いじくりまわしてください。
これはすべて時間の無駄です。言うまでもありませんが、SSLはあなたを助けることにもなりません。2つのSSLエンドポイントのいずれかが悪である場合、SSLはユーザーを保護できません。
ハイスコア詐欺を実際に減らすことができるいくつかの事柄は次のとおりです。
ゲームをプレイするためにログインを要求し、ログインにセッションCookieを生成させ、同じセッションでの複数の未処理のゲームの起動、または同じユーザーの複数の同時セッションを許可しない。
これまでにプレイした実際のゲームよりも短い持続時間のゲームセッションからのハイスコアを拒否します(より洗練されたアプローチについては、平均ゲーム持続時間より2標準偏差未満持続するゲームセッションのハイスコアを「隔離」してみてください)。サーバーサイドでゲーム時間を追跡していることを確認してください。
ゲームを1〜2回プレイしただけのログインからのハイスコアを拒否または隔離します。これにより、攻撃者は、作成するログインごとに合理的なゲームプレイの「紙の証跡」を作成する必要があります。
"ハートビート"はゲームプレイ中にスコアリングするため、サーバーは1回のゲームプレイの存続期間中のスコアの増加を確認できます。適切なスコア曲線に従わないハイスコアを拒否します(たとえば、0から999999にジャンプします)。
ゲームプレイ中の「スナップショット」ゲームの状態(弾薬の量、レベル内の位置など)。記録された中間スコアと後で照合できます。まず、このデータの異常を検出する方法を用意する必要はありません。収集するだけで、物事がおかしい場合は、戻って分析できます。
セキュリティチェックに失敗したユーザーのアカウントを無効にします(たとえば、検証に失敗した暗号化されたハイスコアを送信するなど)。
ただし、ここではハイスコア詐欺を阻止するだけであることに注意してください。防ぐためにできることは何もありません。あなたのゲームのラインにお金があるなら、誰かがあなたが思いつくシステムを打ち負かそうとしています。目的はこの攻撃を止めることではありません。それは、単にゲームを本当に上手にしてそれを打ち負かすよりも攻撃をより高価にすることです。