2012-02-10 68 views
1

假設我在html表單中有100個字段。當所有字段填入時,計算一些分數並顯示給用戶(假設分數值從0到3000)。如何保護GAE服務器端計算邏輯?

當用戶更改任何字段的值時,我們會向他顯示值範圍(0-1000,1001-2000,2001-3000),沒有詳細分數。但是一旦按下提交按鈕,就會顯示確切的分數。

現在我需要保護邏輯 - 因此,用戶不應該能夠理解每個字段如何影響分數。另外,用戶不應該能夠使用某些程序來「玩」這些值,並查看分數是如何改變的。

我想到了以下方法:

  1. 使用會議;
  2. 保持服務器端當前得分值;
  3. 當一個字段中的值發生變化時,將請求發送到服務器並更改字段名稱和新值;
  4. 在服務器端驗證前一次請求發送時,如果時間差過小,則拒絕請求;
  5. 服務器回覆新範圍並保存新值;
  6. 當提交被按下時,服務器回覆評分的服務器值(不要重新計算它,照原樣)。不要經常回復這個問題。

是否還有其他(更好的)方法?

回答

1

這沒有一個單一的解決方案。您可能會嘗試使用戶難以破解它,並且未被發現並採取可能的強制措施。

  • 當用戶顯示錶單並在提交響應之前檢查此特定cookie或標誌時,使用「啓用碼」cookie(或設置會話標記)。一旦提供了響應,則清除啓用器,並且不允許已經提交
  • 的用戶隨機化字段名稱,並在服務器端檢查字段是否具有適當的隨機名稱
  • 使用cookie檢查用戶已經提交表格(很容易失敗)
  • 檢查用戶代理是否與流行的HTTP庫(並且不允許用戶提交表單)
  • 如果相同的IP會導致大量提交 - 不精確,但可能表明有腥意

Tho se是我想到的第一個想法。很可能會有其他有見地的評論。

1

對於客戶端:

  1. 發送田間地頭到服務器並要求分數計算的數據。
  2. 在您的客戶端上添加一個約束,以便在發送新的請求之前等待服務器完成對在步驟#1上發送的請求的回覆。
  3. 當來自服務器的響應回來時,檢查字段上的值,如果與上一次步驟#1相比有任何變化,請重新執行步驟#1。如果沒有,請檢查字段並在檢測到任何更改時進入步驟#1。

現在的服務器:

  1. 當重新計算的請求到來,計算新的得分,但隨後發送計算的結果返回給客戶端前添加人工延遲。 (例如,在將回復發送回客戶端之前睡眠1000毫秒)

通過此策略,您可以將最大速率設置爲「玩」這些值,而不需要進行會話並且不需要需要對每個傳入請求進行時差檢查。

如果您將結果異步發送到客戶端(可能使用Channel API),並將睡眠改爲TaskQueue工作程序,那將會更好。這樣,應用程序引擎調度程序就不會認爲您的應用程序需要派生大量實例,因爲請求處理程序所呈現的高延遲。

+0

謝謝,易卜拉欣。你能否澄清第2項如何實施? – 2012-02-23 21:29:32

+0

我假設您使用AJAX將您的請求發送到服務器?我會設置一個'var hasReplyBeenReceived'標誌,當你發送你的請求時它將被設置爲'false',並且一旦回調方法接收到一個答案就會被設置爲'true'。發送請求的函數將檢查該標誌,並且如果標誌仍然爲假,則不執行請求。您也可以添加一個計時器,該計時器在20秒左右後將此值設置爲true,以防服務器發送其答覆。 – 2012-02-24 13:56:34

+0

嗯,因爲我使用jQuery,可能我可以參考ajaxStart/ajaxStop – 2012-02-24 16:05:47