2015-12-03 186 views
1

我有一個頁面在我的MVC網站上有多個項目,用戶可以點擊添加到他們的籃子。防止垃圾郵件呼叫webservice

點擊'添加'後,我執行$ .ajax()命令調用後端並執行計算,返回結果並更新頁面上的價格。

最近發現,快速連續點擊許多「添加」按鈕意味着用戶等待每個呼叫輪流處理。也就是說,他們點擊10個「添加」按鈕,他們看到價格變化10次。

我不關心用戶界面。我所關心的是web服務調用可能被垃圾郵件所阻止,這反過來又會給數據庫服務器帶來壓力,因爲每個請求都需要數據庫查詢和其他計算。

我已經開始在這樣的「鎖定」標誌中停止Joe Public點擊很多次。

var flag=0; 

function updateBasket() { 
    if (flag = 0) { 
     flag = 1; // Processing 
     var form = $("#ItemsForm"); 
     $.ajax({ 
      url: '@Url.Action("UpdateBasket")', 
      data: form.serialize(), 
      type: 'POST', 
      cache: false, 
      success: function (response) { 
       // code 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       // code 
      } 
     }); 
     flag = 0; 
    } else { 
     // Still processing previous request 
     alert('please wait'); 
    } 

無論其這可以肯定通過進入控制檯和執行

flag=0;updateBasket(); 

我可以在後端以防止此調用正在做的垃圾郵件被規避?我關心的是我控制的代碼,而不是網絡基礎設施級別。

更新:檢查用戶憑據(username0是不可能的,因爲他們可以在不登錄的情況下執行此操作。 如果我在序列化頁面加載時向表單添加了唯一值,我可以檢查後端我上次看到它,但所有攻擊者會做$('#uniqueValue')。val('newValue);並取消它。這是我認爲我可以防止垃圾郵件到數據庫的地方,但我不知道如何。

+0

表單上是否有任何唯一標識該表單/用戶(或者您使用任何形式的認證)? (我猜他們必須有'添加'一些東西,即使他們現在是匿名的)如果是這樣,你可以使用這個服務器端來檢查該用戶請求的數量(例如最後一分鐘)*然後在訪問數據庫之前返回錯誤「太多的請求」。 –

+0

通常,您不希望在進行ajax調用時(如在您的代碼中)阻止ajax調用 - 而是阻止/禁用* add *按鈕,直到ajax調用返回。 –

+0

如果你的'#uniqueValue'是你驗證過的服務器端生成的一個令牌,那麼不,他們不能只是放入一個新的值,因爲那樣他們會得到一個驗證錯誤。但是這需要額外的電話來獲取令牌,也許這也可能是垃圾郵件。 –

回答

0

我會將我的所有JavaScript從最終用戶中分離出來,這個。

(function() { 
    function updateBasket() { 
     ... 
    } 
})(); 

這樣做將意味着updateBasket()不能在控制檯中調用。

這被稱爲自我執行匿名功能。這裏有一篇很棒的文章:http://markdalgleish.com/2011/03/self-executing-anonymous-functions/

+0

「我不關心用戶界面。」 –

+0

@ freedomn-m這與UI有什麼關係? –

+0

雖然這可以通過某種方式來停止控制檯中明顯的'flag = 0',但它不會阻止知道js的人。 'updateBasket()'仍然可以被調用,而不是你定義的* same * updateBasket ... –