2012-02-07 47 views
1

我使用Ajax將JSON數據發送到我的服務器以便解析一個php腳本。保護/驗證服務器的JSON請求

例如這是將輸出的JSON: http://myserver.com/parse.php?user=123&point=100&callback ......

和「parse.php」的劇本將獲得在URL中的點,它給用戶該用戶標識存儲在用戶= 123。

但是,如果一個人直接在他們的瀏覽器上使用「http://myserver.com/parse.php?user=123 & point = 100 & callback ......」而不讓我的javascript啓動它,他們可以欺騙他們的點數,他們可以在網址中設定他們喜歡的任何數量。

那麼我如何保護/驗證JSON請求?

+0

你可以通過POST(雖然有可能僞造POST),或者可能以某種方式加密點。另一個想法是檢查請求是否來自同一臺服務器(換句話說,防止直接訪問)。例如,檢查一個var是否是'DEFINED'(也不是最好的方法,但簡單不是那麼簡單)。 – jackJoe 2012-02-07 09:58:01

+0

加密數據,好主意。我去做。 – sm21guy 2012-02-07 10:22:22

回答

1

如果你通過Ajax請求或者類似的客戶端傳遞用戶點,那麼你根本無法保護您的應用程序免受作弊。你的用戶告訴腳本他/她得了100分,你怎麼能確定這是公平的數字?傳遞您用來計算分數的初始數據,例如問題的有效答案或您正在測量的任何內容。

如果您的應用程序中有登錄機制,則可以在執行腳本時檢查服務器端的有效憑據,而不通過GET/POST實際傳遞用戶標識。

最後,在你的方法,你可以檢查AJAX頭以及引薦($_SERVER['HTTP_X_REQUESTED_WITH']$_SERVER['HTTP_REFERER']),以確保請求來自您的JS代碼,但是這真的只是一個小調整這是很容易compromize。此外,並非所有瀏覽器都會傳遞引薦標題(取決於隱私設置),因此可能會出現更多問題。

+0

感謝您的建議! – sm21guy 2012-02-07 10:22:48

-1

不要在客戶端放置任何遊戲數據和邏輯。 永遠不要相信客戶。你總是必須計算服務器端。

更多的相關信息(不依賴鏈接的標題,有在回答了很多的相關信息):https://gamedev.stackexchange.com/questions/3695/how-do-you-prevent-your-javascript-html5-web-game-from-being-copied-or-altered

+0

他的邏輯在服務器端。他只是將客戶端數據發送到服務器。問題是關於安全。 – Zakaria 2012-02-07 10:17:07

+0

嗡嗡聲...從客戶端發送數據到服務器,並依賴於數據,是「將遊戲數據放在客戶端」。無論如何,這都是必須避免的。我的答案是關於安全性。你告訴他要確保他的請求,但他不必這樣做,如果他想證實他的數據,他不得不依賴客戶的請求。 – dievardump 2012-02-07 10:27:08

+0

我沒有在任何遊戲上工作。我只是舉一個例子,尋找更好的方法來保護數據。只是想了解更多。 :) – sm21guy 2012-02-07 10:33:26

0

要求用戶登錄才能調用parse.php。如果請求沒有提供有效的會話ID,請拒絕採取行動。