2016-12-17 16 views
0

私は困惑しています。 これはUnity3Dの私のゲームです。Unity3DからPHPへのセキュリティ問題

これは、人々が通常どんなプレイをするかという点で意味をなすようにします。 アカウントに500ゴールド(データベースに保存されています)がプレーヤにあるとします。 そして、プレイヤーは何らかの仕事をして243ゴールドを得ます。 (Unity3D)は、彼らが243ゴールドを得たPHPファイルをどうやって伝えることができましたか?

ここに問題点があるので、 Unity3DにはWWWというクラスがあります。 PHPファイルに何らかの文字列を送ることができます。あなたが見ることができるように

int currentGold; 
string goldToSend = currentGold.ToString(); // Only using that for example. 

WWWForm form = new WWWForm(); 
form.AddField("NameOfPostRequestInPHPFile",goldToSend); 
WWW www = new WWW("website.com/PHPFile.php", form); 

は今、私は1つが、実際に、その後にPHPにクライアント側からのランダムな金の額を送信する方法を、あなたは何をクライアントに信頼することはできませんという、かなり大きなジレンマに陥っていますデータベースに入れる。

私が直面している問題は、クライアントが実際にそのことを話すことなく、PHPが実際に何をしているのかを理解できるようにするにはどうしたらいいのでしょうか?ロードするPHP、このデータを使用してデータベースに格納します。

私はハッシュを使用することを考えましたが、それでもクライアント側で問題が発生します。その後、ハッシュはちょうど彼らのよこしまな試みを合うようにローカルで変更される可能性があるため文は明らかに、いずれかの動作しない場合

を使用して、あなたが見ることができるように

if(sentGold == 243){ 
string hash = hash01; 
// Change it to hash1000 (to get 1000 gold). 
} 
if(sentGold == 1000){ 
string hash = hash1000; 
} 

としましょう。加えて、20Kのif文を持つことはごみのように見えます。

ハッキングを完全に停止することは不可能です。しかし同時に、もし私が何かをしたら、私はそれを正しくやりたいと思っています。私が何を意味するのか分かっていないのですか?

この点で私のヘルプメッセージを読んだことがあれば。 私はあなたがそれを読むことに入れた時間を本当に感謝します。 それは私に多くを意味します。

これで私の手助けとなるかもしれない他の技術やヒントがあれば、それについてのチュートリアルもありますが(私は数日間探していますが)、誰も対処していないのでまだデッドロックしています彼らが秘密鍵などを使うかもしれないという事実だが、彼らが送った文字列が簡単に改ざんされることに対処していない。彼らがしなければならないことは、243〜9999999999のために変更され、その後、彼らは豊かです。

+0

あなたが話している方法ではできません。渡される情報の正当性を検証するサーバーはありません。クライアントが渡す情報を確認する必要があります。ゴールドがスポーンポイントである場合、スポーンポイントがデータベースに存在するかどうか、およびスポーンポイントにどのアイテムと数量が存在するかをチェックするなどです。 – spencdev

答えて

1

クライアントを信頼できませんか?正しい。
しかし...
あなたはこの船の船長です。したがって、あなたのサーバーは、不正行為を検出するのに十分スマートである必要があります。
ゲーム中の特定のタスクが200ゴールドを与える場合、そのタスクの参照を値(200、 "SomeTask")とともに送信できます。クライアントが(10000、 "SomeTask")を送信しようとすると、サーバーはそれを不正行為と見なします。あなたは、クライアントがタスクをどれほどうまく実行できるかに基づいて可変金額を得ることができます。この場合、金額をデータベースに追加する前に、すべてのタスクに対して最大制限値を設定して確認することができます。

クライアントからの総金を決してデータベースに保存しないでください。クライアントは新たに獲得した金を送ることができるだけで、合計金額を返します。例については

Database: 2000 gold -> Game: 2000 gold 

Game: POST (130,"pickupjewel"); 

Databse: if (130 <= MaxValue("pickupjewel")) [TRUE] -> SUCCESS 
Database: 2130 gold -> Game: 2130 gold 


Game: POST (999999,"pickupjewel"); 

Databse: if (999999<= MaxValue("pickupjewel")) [FALSE] -> FAILURE 
Database: 2130 gold -> Game: 2130 gold 

私はこのことができます願っています。特定の問題がある場合はお知らせください。

+0

コメントをいただき、ありがとうございました。再度、感謝します! – n1warhead

関連する問題