2013-02-22 54 views
-1

我已經創建了一個PHP文件將更新分數數據庫。例如:http://domain.com/heli/test.php?id=100001181378824&score=50000PHP:安全的方式來得分後通過JavaScript

test.php的包含下面的代碼

mysql_connect(localhost,$user,$password); 
$id = mysql_real_escape_string($_GET['id']); 
$score = mysql_real_escape_string$_GET['score']); 
@mysql_select_db($database) or die("Unable to select database"); 
$query = "UPDATE heli SET score = '$score' WHERE app = '$id'"; 
echo $query; 
$result=mysql_query($query); 
mysql_close(); 

我想知道如何做到獲取或發佈請求給我的test.php通過Javascript以安全的方式。現在我已經創建了下面的Js。

var httpwp = new XMLHttpRequest(); 
var urlwp = "http://domain.com/heli/test.php?id=100001181378824&score=50000"; 
var paramswp = "id="+ids+"&score="+scores+"; 
httpwp.open("GET", urlwp, true); 
httpwp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
httpwp.setRequestHeader("Content-length", paramswp.length); 
httpwp.setRequestHeader("Connection", "keep-alive"); 
httpwp.send(paramswp); 

但如何使用驗證密鑰等安全地發佈或獲取請求?

+1

你是什麼意思的「安全」 - 你的意思是它不能在客戶端操縱?這是一個不平凡的問題。 – 2013-02-22 11:46:41

+4

您的PHP代碼將讓您的數據庫保持開放狀態。 – Blender 2013-02-22 11:46:43

+0

另外我會建議重構你的代碼,以便計算得分並設置服務器端。最直接的方式來解決你的問題。 – Mahn 2013-02-22 11:47:56

回答

1

您永遠無法確定客戶端提交的數據。

爲了使這更「安全」,您必須在服務器上編寫一些邏輯,計算得分。

例如。假設你現在開始遊戲,3秒後你提交1000分。 這可能嗎?

您必須創建一些步驟或限制,例如,如果玩家處於1級,則分數不能超過100分,並且在1分鐘的遊戲玩法之前不能獲得分數。等等!

祝你好運。

+0

感謝您的有用信息。 – 2013-02-22 12:02:37

1

1.首先,修復您的PHP代碼,以免您不容易受到SQL注入攻擊。

2.接下來,通過https訪問您的服務器而不是http。

3.添加一個php文件來接受一個名稱和密碼的登錄請求,這將返回一個唯一的會話密鑰。 (一個大的隨機數可能足夠好,或者隨機數據的sha1散列+請求中的一些數據)

4.將此數字與發佈日期一起存儲在服務器端數據庫中。

6.讓您的應用程序在上傳樂譜之前從該文件獲取會話密鑰。

7.讓你的分數保存php文件接受你的會話密鑰連同分數數據並與數據庫進行比較,看它是否有效,而不是太舊(檢查發佈日期)。

8.存儲一個新的會話密鑰並返回分數更新結果,並從數據庫中刪除舊的會話密鑰。

9.讓您的js在以後的帖子中使用新密鑰,每次從服務器獲取新密鑰。

10.在您的php應用程序中進行健全性檢查以檢查可笑和不可能的分數。同時檢查獲得的大分數太快。

+0

我使用Facebook應用程序,如何獲得唯一的會話密鑰 – 2013-02-22 12:18:19