ここで注意すべき点がいくつかあります。
まず、このようなものに対するサーバー リクエストは、GET ではなく POST である必要があります。GET リクエストのみが冪等であるべきであり、そうしないと実際には HTTP 仕様に違反します。
第二に、ここで見ているのは、古典的なClient Trust Problemです。クライアントがスコアやその他のゲーム間隔情報をサーバーに送信することを信頼する必要がありますが、クライアントが不正なデータを送信することは望ましくありません。許可されていないアクションを防止するのは簡単ですが、許可されたアクションで不正なデータを防止することは、はるかに問題です。
Ben S は、このようなクライアントとサーバー間の通信プロトコルをどのように設計するかについて、優れた点を指摘しています。ポイント値を信頼できるデータとして送信できるようにすることは、一般的に悪い考えです。アクションが発生したことを示し、サーバーに割り当てる必要がある場合はいくつのポイントを割り当てるべきかを判断させることをお勧めします。しかし、それを回避できない場合もあります。レーシング ゲームのシナリオを考えてみましょう。クライアントはユーザーの時間を送信する必要があり、「completedLevelFour」などの他の呼び出しに抽象化することはできません。それで、あなたは今何をしますか?
Ahmet と Dean が提案するトークン アプローチは適切ですが、完全ではありません。まず、トークンをクライアントに送信する必要があります。つまり、潜在的な攻撃者によってトークンが発見され、悪意を持って使用される可能性があります。また、ゲーム API をステートレスにする必要がある場合はどうすればよいでしょうか? これは、セッションベースのトークン認証が廃止されたことを意味します。そして今、あなたはクライアントの信頼問題の深く暗い腸に入ります.
100% 誰にでもできるようにするためにできることはほとんどありません。しかし、チートするのは非常に不便です。Facebook のセキュリティ モデルを考えてみましょう (すべての API 要求は署名されています)。これは非常に優れており、攻撃者がリクエストを偽装する方法を理解する前に、クライアント側のコードを実際に掘り下げる必要があります。
もう 1 つのアプローチは、サーバー リプレイです。レーシング ゲームのように、「時間」の値をサーバーに送信するだけでなく、時間も記録してすべて送信するチェックポイントを設定します。各間隔の現実的な最小値を確立し、このすべてのデータが確立された境界内にあることをサーバーで確認します。
幸運を!