2017-11-05 13 views
1

私はJavaでゲームのようなシンプルなヘビをコーディングしました。私は高得点のユーザーをデータベースに保存したいので、mySQLデータベースを作成しました。私が直面している問題は、プログラムをmySQLデータベースに接続させ、ユーザーがデータベースを混乱させるようなログイン情報を漏らさないようにすることです。私はそれを調べ、誰もがゲームとSQLデータベースの中間にあるWebサービスを提案しました。しかし、問題は依然として残っており、誰もがデータをフィードして再びデータベースを台無しにする可能性があります。mySQLデータベースが自分のゲームからのみ値を取得する方法を確認するには?

私が考えてきたオプションの1つは、jarファイルをWebサービスにデータとともにアップロードすることです。次に、Webサービスはハッシュ値(SAH 512を調べています)を取得し、取得するハッシュ値と比較し、一致すれば処理を進めます。しかし、誰かが自分のゲームをリバースエンジニアリングし、コードを少し変更して元のゲームファイルを送信することができますが、別のNAME + SCOREをデータベースに送ります。また、人々がウェブサービスにファイルをアップロードし続けることは、私がホームネットワークを使用していると考えるほどにしか扱うことができないため、私のネットワークに大きな痛みを与えます。

私はパスワードを使ってファイルを暗号化できますが、プログラムはそれを復号化できるので、ユーザーはそれを解読して情報を取得することもできます。

基本的にとにかく私のデータベースにキーをプログラムに提供します。誰かがそれをリバースエンジニアリングして編集して自分のデータベースにアクセスできるようになります。それはそれの背後にある私の考えです。とにかく私はプログラムにデータベースにアクセスする方法を提供します。誰かが望むならデータベースを使いこなすためにその方法を使うこともできます。

私のゲームからの情報をmySQLデータベースに保存し、誰もそれを変更することができないようにする方法が必要ですが、私が作ったプログラムだけが可能です。何とかサービスや何かの背後にある詳細を隠すこと。他の人たちはどのようにそれをやっているのですか?私はいくつかの指導を受けることができますかどんなアイディアも大歓迎です。

答えて

1

通常、アプリケーションはデータベースに直接接続するのではなく、dbアクセス権を持つサーバーを呼び出します。

+0

はい、しかし、プログラムはそれが誰であるのかをサーバーがどのように知っていますか?誰かが自分のゲームをリバースエンジニアリングし、コードを少し変更して、あたかもゲームのようにサーバーとの通信を開始することができます。彼らはデータベースを使いこなすことができます。サーバーがゲームを識別し、要求が信頼できるものであることを確認できる方法が必要です。 – nightlife120

0

実際、その保証はできません。アプリケーションはいつでもデコンパイルして動作を変更できます。

この制限を受け入れると、中間層(Webサービス)を使用して特定のレベルのセキュリティを保証できます。ここでは、セキュアなトランスポート層(SSL)と、アプリに配置されたユーザー証明書による信頼できるログインを保証することができます。また、送信されたデータにデジタル署名を追加することもできます。

これにより、アプリケーションを逆コンパイルする必要のある信頼性の高いシステムが得られます。

0

これは古くからの問題であり、簡単な解決法はありません。シナリオによっては解決できるものもあれば、解決できないシナリオもあります。

基本的なルールは、クライアントで行うことは、セキュリティに関してはほとんど役に立たないということです。あなたが言ったように、誰でもあなたのクライアント側のコードを逆コンパイルして分析し、秘密などを得ることができます。ユーザーはクライアントを完全に制御しているため、クライアントから送信されたデータ(スコア)は信頼できません。

サーバー側のソリューションが必要なので、興味深いところです。あなたが実際にできることは、ゲームの流れ(すべてのイベント)をサーバーに送信して、サーバー側で起こったことを完全に(または少なくとも部分的に)再構築できることです。スコアは送信される必要もなく、クライアントでのゲームの進行状況からスコアを計算することができます。

シングルプレイヤーのスキルゲームの場合、これは役に立ちませんが、ユーザーは本当にうまくいっているように全体の流れを構築できます。しかし一方では、それはスコアを偽ることよりもはるかに難しく、他方では解決策が出てくるところがゲームであるかもしれません。特にNP困難なゲームの場合、その解決策を見つけることは確かにそのトリックであり、簡単であることを証明します。

また、マルチプレイヤーゲームでは、すべてのプレイヤーがフローを送信すると、受け取ったフローが一致する必要があります。そうでなければ、チーターがいる(またはすべてのプレーヤーがチーターか、しかし、他の方法でそれを防ぐことができるはずです)。

ゲームの全体的な流れがある場合、たとえばスキルゲームのような他の反キテッティング技術を実装することもできます。スーパーヒューマンと思われるアクションを見つけようとすることができます。それは決して完璧ではないでしょう、そして、正当な選手を詐欺師としてマークすることは困難です。

0

それは少なくともあなたのゲームを台無しに望んでいる誰かがこのようなことができため、それは少し難しくなります少し...

一例依存:あなたのゲームが手続き生成されている場合

をコンテンツ、店舗その後、ちょうどスコアと名前を送信することはありません...初期シードを送信...

店やゲームサーバーのリプレイせ、特定のスコア

につながるすべてのプレイヤーの意思決定を送信ベース提供種子や意思決定、そして上のDはあなたがゲームを解決する必要がありますスコア(またはそのための自動化されたアプローチを)

このアプローチ偽造する...

ので、サーバー上で算出したスコアを取りますスコアを偽造するのが難しくなりますが、名前とスコアを結びつけません(別の名前で同じスコアを後で提出することもできます...)

オンラインスコアはオンラインゲームが必要です...

ゲームが開始されると、プレイヤー名を尋ねます...ID(GUIDと考える)とサーバ発生開始種

サーバストア名とIDを含む、HMAC(ハッシュメッセージ認証コード)保護されたトークンをAQUIREするため、ネームサーバへの

ポストプレイヤーが終了したときに、それがそのタイムスパン

以内に「使用」されなかった場合、あなたはそれを削除することができ、その後、タイムスパンとIP

トークンがタイムスパンxの有効なあたりのトークンの数が限られていますゲーム、あなたはサーバーにプレーヤーの決定と一緒に、このトークンを提供することができます

は、サーバは、プレイヤーが誰であるかを知っている、とすることができますが、最終的なgamestateを再作成し、不正行為のすべてのフォームを防ぐことはできません

システムこのようなスコアを見つけ、彼らは、少なくとも通常、その実装が難しいと需要はありません攻撃者から少しの努力を払ってスクリプトの児童を除外します

関連する問題