1

私は Flash ゲームのバックエンドに取り組んでおり、スコアボードに入るデータを保護する必要があります。

ゲームはバナー広告で多くのサイトでホストされ、ユーザーは広告でゲームをプレイし、クリックしてメイン サイトにアクセスして詳細を保存します。

現時点では、私はこれに沿って考えています

  1. ユーザーがゲームをプレイし、クリックしてスコアを送信する
  2. バックグラウンドで、バナーはスコアと元のドメインをメイン サイトのスクリプトに送信します。
  3. スクリプトは、ドメインが広告がホストされている有効なドメインの 1 つであるかどうかを確認します。
  4. すべてが正しければ、スクリプトはこのスコアとドメインのハッシュを作成し、スコアとともにデータベースに保存します。
  5. スクリプトはハッシュを Flash に返し、メイン スコアボードを開く getURL のクエリ文字列にハッシュを追加します。
  6. スコアボード ページはリファラーをチェックして、それが有効なドメインの 1 つであることを確認します。
  7. 有効なトークンである場合は、ハッシュのデータベースをチェックします
  8. 次に、ユーザーが詳細を入力すると、ハッシュに基づいてレコードが更新されます

前回、FLash がリファラー情報を送信しないことを確認しました。では、この種の Flash とデータベースのやり取りのパターンはすでに確立されているのでしょうか?

ステップ 4 では、どのようなハッシュ/チェックサムを使用すればよいですか? この種の操作の正しい名前は何ですか?それはハッシュ、チェックサム、または何か他のものですか?

クライアント側のテクノロジーであるため、Flash が実際にそれほど安全ではないことは理解していますが、私の考えでは、上記のようなことは、この種のアプリケーションをハッキングするのと同じくらい難しいことです。

更新: 私の主な目的は、スコアをデータベースに追加するスクリプトの URL を人々が見つけにくくし、単に偽のスコアでスパムすることです。

ありがとう、グレッグ

4

2 に答える 2

2

基本的に、スコアが正当なクライアントからのものであることを確認する必要はありません。クライアントが実際にゲームをプレイしてスコアを達成したことを確認する必要があります。基本的に期待できる最善の方法は、ゲームをプレイするための AI を作成する必要があることです。

試してみることができるいくつかのことを次に示します。

  • 入力をゲームに記録し、スコアとともに送信します。その後、サーバーは、スコアが可能なゲームに対応することを検証できます。この方法で重複送信を検出することもできます。
  • レート制限を適用して、クライアントが明らかに非人道的なペースでスコアを送信するのを防ぎます。実際に達成できることに基づいて許容スコアに上限を適用し、1 秒あたりのアクションなどに下限を適用します。
  • 前の入力を使用して、疑似乱数ジェネレーターを部分的にシードします (1 つを使用すると仮定)。これにより、クライアントが提出物をわずかに変更しても、有効なゲーム/スコア コンボを取得できる可能性が低くなります。
于 2009-03-23T17:30:20.443 に答える
1

私は以前にゲーム業界で働いていて、これらの方針に沿って何かをしました。私の知る限り、スコア提出部分をクラックすることを気にする人は誰もいませんでした。

それが行われた方法は次のとおりでした:

  1. 乱数をソルトとして生成する(フラッシュから)
  2. ソルト(フラッシュから)に基づいて、数学演算を使用してスコアをエンコードします
  3. チェックサムを追加して、スコアに焼き戻しがないことを確認します(フラッシュから)
  4. スコアと必要なデータをスコア送信ページに送信します
  5. サーバーで、チェックサムを使用してスコアが調整されていないことを検証します
  6. スコアが有効な場合はデータベースに挿入し、そうでない場合は拒否します
  7. 必要に応じて、チェックサムに違反するスコアの送信者のIPアドレスをログに記録し(おそらく3つの悪いチェックサムのポリシー、あなたは外出しています)、サーバーへの1時間のアクセスを禁止するスクリプトを追加できますが、これはおそらくそうではありません誰かがあなたのコードをそれほどひどくクラックしたくない限り、必要です。

注:ハッシュ/チェックサムはカスタム関数を使用して行われました。非常に安全なものは必要ありませんでした。塩とスコアの計算を使用して作成されました。合計、乗算、減算などの単純な数学演算。


編集:チェックサムの簡単なアルゴリズム/数学

ユーザーのスコアが5885だとします。134789
のソルトとして乱数を生成します(一定の長さ、0のパッド)

cryptedScore =スコア*ソルト(ここではもう少し複雑なものを使用する必要がありますが、これは単なる例です)

この例では、暗号化されたスコアは793233265になります。

ここで、チェックサムについて、チェックサムとして253の値を設定するとします。
暗号化されたスコアのすべての数値を加算します7+9 + 3 + 2 + 3 + 3 + 2 + 6 + 5 = 40


ここで、このスコア253のチェックサムの値を計算します-(暗号化されたスコア数の合計%253

これで、次の数値が得られます。
ソルト= 134789
暗号化されたスコア= 793233265
チェックサム= 40

サーバーにリクエストを送信し、スコアとして134789793233265040を送信します。

スコアサーバーでは、793233265を134789で割る5885なり、以前と同じ関数を使用してチェックサムを検証できます。

チェックサムが失敗した場合、数値は改ざんされています。

おそらくもっと安全なものになってしまう可能性がありますが、それでうまくいくはずです。

于 2009-03-23T17:46:02.107 に答える