質問: オンラインのリーダーボードphp/sqlの不正更新を回避 私はcordova(phonegap)を使用してアンドロイド用のオフラインWebアプリ(ゲーム)を開発しています。同じのリーダーボードは私のサーバーでオンラインで管理されています。 現在これがリーダーボードの更新方法です ステップ1)ユーザーのスコアはオフラインアプリのローカルストレージに保存されます。 ステップ2)ユーザがインターネットに接続している「私のスコアを更新する」ボタンを押す。 Step 3) The button basically sends an ajax request to ステップ4)これに基づいてデータベースはscoreupdate.phpファイルによって私のサーバーで更新され、成功を返します。 **これらは私が直面している問題です** 1) Anyone can easily visit if they know the user id (It can be easily obtained from the app's localstorage data) and he/she can update his/her score in the leaderboard simply by replacing obtained_score value with some high value to get a better position in leaderboard. 2)全体がJavascriptで構築されているので、アプリやlocalstorageに保存されている秘密の値は簡単に取得できます。アプリのリバースエンジニアリングも可能であるため、リクエストをサーバーに送信しているのが本人のアプリであることを効率的に認証する方法を見つけることができませんでした。 **私の要件** 1)アプリはscoreupdate.phpファイルが本物のアプリであり人ではないことを認証できる必要があります。アプリだけがリーダーボードを更新できるようになります。 2)認証のロジックは、単にアプリのソースコードを読むことによってユーザーによって解読されてはならない。 (例:ユーザーIDにいくつかの数字を掛けてサーバーで逆の処理をしてもうまくいきません) これを達成するためのいくつかの方法はありますか? Javascriptのスクランブルは、簡単にスクランブルを解除できるため、効果的ではありません。 **編集** 誰かがMITMまたはブルートフォースのような攻撃によってユーザーの資格情報を盗んでも、私は心配しません。プロファイルを所有している実際のユーザーでも、自分のスコアを更新することはできません。
回答: 不可能だとは思わない。 ゲームの形態によっては、以下のスキームを適用することが可能かもしれません。 1. ゲーム中に、RNGへのシードとユーザーからのすべての入力を含む開始状態を記録します。 2. ゲームを送信するときは、セッションのこの「再生」を要求されたスコアと一緒にサーバーに送信してください。 3. サーバーで、提供された入力を使用してゲームロジックを実行し、それが同じスコアになるかどうかを確認します。そうであれば、リプレイは有効であり、あなたはスコアを更新します。 このようにして、あなたは不正行為の問題をあなたのゲーム用のボットやソルバーを書く問題に効果的に変換しました。 基本的に、これは解を検証することが計算的に困難である一方で解を検証することがNP完全問題と見なすことができるどんなゲームにとっても非常に良い解決策です。その一例が倉庫番です。