2014-03-13 104 views
3

我有一個打字測試網站。用戶可以在登錄後進行測試。在測試結束時發出一個ajax並顯示準確,每分鐘鍵,錯鍵按下等的結果..從控制檯阻止js攻擊

enter image description here

我注意到,有人創造了我的網站上的帳戶,他總是與2000年或更高的關鍵每分鐘的關鍵。我發現只有一件事是做ajax的技巧。 任何人都可以運行像這樣的新價值控制檯面板阿賈克斯 -

$.ajax({ // this is the main code we have to prevent 
type: 'POST', 
url: '/typingtest', 
//dataType: 'json', 
data:{ 
    "corrects":2000, 
    "incorrects":0, 
    "netwpm" : 2000, 
    "FixedMistakes" : 0, 
    "TotalEntries" : 20000, 
    "ErrorRate" : 0, 
    "RawSpeed" : 50000, 
    "KeySpeed" : 50000, 
    "CompleteWords" : 2000, 
    "TotalTime" : 1, 
    "accuracy" : 200, 
    "ajaxSubmit" : "ajaxSubmit" 
}, 
success: function(data) { 
    window.location.href = data; 
}, 
complete: function() { 
    // Schedule the next request when the current one's complete 
} 
}); 

而且他會得到這樣的結果 -

enter image description here

我曾試圖與一些標誌變量來驗證對阿賈克斯頁。但任何用js完成的任何人都可以看到它,並輕鬆地調試此過程以更改值。最後他可以運行ajax。

有沒有人有任何想法來防止這種事情發生?

+0

使用閃存不是一個選項?當你在這種情況下使用JavaScript時,它很容易被破解。 –

+0

是的。但客戶需求僅限於js。 –

+1

爲什麼不更改代碼過程?嗯發送一個Ajax請求對用戶獲得的每個關鍵分數只是不要忘記排隊每個請求,因爲我認爲你是從客戶端發送到服務器端的原始分數 –

回答

1

在每分鐘的單詞的情況下,我建議:

在開始測試之前,請確保你的服務器端代碼知道有多少話是在測試中。最好確保每次都是隨機的。

當用戶開始測試以便獲得測試開始時間的時間戳時,向服務器發送請求。

在測試過程中,計算成功完成了多少個單詞。

然後在測試結束時再次發佈成功完成單詞的數量以獲得總的經過時間。向服務器確認完成的單詞數量與最初給出的原始單詞數量相同,以確保沒有人篡改該數字。

這樣,客戶端不會跟蹤任何無法驗證的信息。


準確性有點難以驗證,但只要確保設置一個最大值(準確度爲200%是絕對不可能的!)。


此外,還可以嘗試通過模糊的安全性(參見How can I obfuscate (protect) JavaScript?),但這不是最安全的方法,因爲經驗JavaScripters仍然可以知道發生了什麼事情。