我有一個頁面在我的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);並取消它。這是我認爲我可以防止垃圾郵件到數據庫的地方,但我不知道如何。
表單上是否有任何唯一標識該表單/用戶(或者您使用任何形式的認證)? (我猜他們必須有'添加'一些東西,即使他們現在是匿名的)如果是這樣,你可以使用這個服務器端來檢查該用戶請求的數量(例如最後一分鐘)*然後在訪問數據庫之前返回錯誤「太多的請求」。 –
通常,您不希望在進行ajax調用時(如在您的代碼中)阻止ajax調用 - 而是阻止/禁用* add *按鈕,直到ajax調用返回。 –
如果你的'#uniqueValue'是你驗證過的服務器端生成的一個令牌,那麼不,他們不能只是放入一個新的值,因爲那樣他們會得到一個驗證錯誤。但是這需要額外的電話來獲取令牌,也許這也可能是垃圾郵件。 –