-3

私が設計しているオンライン ゲームの php バトル システムを作成しようとしています。

要するに、これは MMORPG になり、プレイヤーの統計は、モンスター データと同様に、いくつかの MySQL テーブルに保存されます。

要するに、人々がモンスターの HP を自分たちで編集することによって何かをしているのではないかと心配しているので、彼らはモンスターを殺し、コンピュータ上で最大 HP を維持していると書かれています (MySQL エントリを更新するのは非現実的ではないからです)。毎ターン?)、または多分何か他のもの。

私はまだ PHP の中級者にすぎないので、これらの値がユーザーによって変更されないようにするにはどうすればよいかわかりませんが、攻撃が発生するたびに MySQL テーブルを更新して深刻なサーバーの輻輳を引き起こすことはありません。

どなたか、次のうち 1 つ以上を教えてください。

  1. これらのアクティブな変数が編集されないように隠してチートを許可する方法は PHP だけであるでしょうか?

  2. そうでない場合、またはサーバーにあまり適していない場合、Java に比較的単純なアプレット、または比較的単純な方法でプログラムできるホスト変数を制御するためのアプリはありますか?

今のところ、モンスターは通常攻撃のみ、プレイヤーは攻撃のみですが、プレイヤーのスキル攻撃を先に拡張する予定です。

4

1 に答える 1

4

ブラウザがサーバーに与えるものを決して信用してはいけません。ブラウザは必要なすべてのリクエストを行うことができます (たとえば、5000 フィート前方に移動します) が、サーバーがリクエストを見て、「すごい、そんなことはできません! 最大速度は 2 フィート/秒です」と言った場合! 次に、「移動のリクエスト」を拒否するか、無視します。選択は、実装に応じて異なります。

たとえば、クライアント (ブラウザまたはデスクトップ上のアプリケーション) は、必要なすべてのデータを格納できます。HPとリソースを保存できます。サーバーには、これらの独自のコピーもあります。誰かがメモリ変更ツール (Cheat Engine など) を使用した場合、クライアントのデータを変更することしかできません (たとえば、100 ドルから 1,000,000 ドルではなく)。しかし、これは何の意味もありません。クライアントが 50,000 ドルのアイテムを購入するリクエストを行った場合、サーバーはそのリクエストを検証するからです。クライアントではなくサーバー上のお金を見て、ユーザーの資金が不足していることに気づきます。ユーザーに「お金が足りない」と伝えるだけで、NPO法人の取引が成立します。

クライアントがクライアントの内部メモリをいじろうとしても、クライアントが正しく機能しなくなる心配はありません。サーバーがゲーム状態の変更に対するすべてのリクエストを承認することを確認してください。すべてがうまくいくでしょう.

ネットワークへのスパム送信を回避し、ユーザーの移動を有効に保ちたい場合、クライアントは、サーバーが要求を承認すると想定できます。したがって、ユーザーが特定の距離を移動できるようにして、数秒後に単一のリクエストを送信するか、複数のリクエストを送信して、サーバーがリクエストを承認するのを待つ間にキャラクターが動くことを示すことができます。これにより、複数のリクエストを行い、サーバーが応答するのに時間がかかる場合、クライアントのサーバーとの非同期化という新しい問題が発生します。

一般に、多くのリクエストを送信する必要があり、ユーザーが何かを行うたびにリクエストを送信する必要があります。これは、他のユーザーにも自分が行っていることを確認したいためです。これを回避する方法はありませんが、巧妙な圧縮と遅延戦術を使用して、クライアントがよりスムーズに動作できるようにすることができます。

SQL サーバーに常にアクセスすることを避けたい場合は、Memcacheなどのキャッシング ツールを使用できます。これは、PHP で非常に優れたサポートが提供されているため便利です。Memcache は、非常に高速なデータ ストレージのために必要なものをすべてメモリに格納できます。もちろん、キャッシュをデータベースと同期する必要があるため、これには注意が必要です。

于 2012-09-18T23:33:32.250 に答える