2012-02-24 90 views
8
惡意行爲

有人讓我意識到我的工作(主要是內我在前端的JavaScript)的應用程序的一些缺陷,留下打開的,說的可能性,點擊一噸一次按下按鈕併發送大量交易電子郵件。這顯然不好。速率限制,以防止ExpressJS

我覺得ExpressJS處理這一個方法是通過使用app.all()計數一定時間內發生的請求數。我會將它存儲在帶有時間戳的會話元數據中,並且如果在Y時間內發生了超過X個請求,我將它們關閉一段時間,直到限制到期。

有沒有人這樣做過,或有任何提示/提示,以幫助我嗎?一些容易進出我的應用的東西是可取的。謝謝!

+1

來處理這種情況的最好辦法是,以確保郵件要麼不堵塞,而不是事務性的。 – Raynos 2012-02-24 02:19:06

回答

2

你可以在網頁中使用Collate對象。

function Collate(timeout) { 
    this.timeout = timeout || 1000; 
} 
Collate.prototype = { 
    time: 0, 

    idle: function() { 
    var t = new Date().getTime(); 
    return (t - this.time > this.timeout && (this.time = t)); 
    }, 

    prefer: function(func) { 
    this.func = func; 
    clearTimeout(this.timer); 
    this.timer = setTimeout(func, this.timeout); 
    } 
}; 

如果你想有一個函數運行一次,而不是在未來1秒鐘之內再次運行。 一樣,如果要防止用戶提交表單很多次了,你這樣做:

var timer = new Collate(3000); //3 seconds 
button1.onclick = function() { 
    if(timer.idle()) { 
     button1.form.submit(); 
    } else alert("Don't click too quickly!"); 
} 

//or on the form tag 

<script>var submitTimer = new Collate(3000);</script> 
<form action="post" onsubmit="return submitTimer.idle();"> 

如果你希望一個觸發事件,多次,只希望它激發的最後一次反應。 一樣,如果你想有一個用戶完成輸入後進行搜索,你這樣做:

var timer = new Collate(700); //0.7 seconds 
textfield1.onkeyup = function() { 
    timer.prefer(function() { 
     autocomplete.search(textfield1.value); 
    }); 
}; 
+4

像這樣的客戶端解決方案只會工作由用戶以防止意外的行動,但不一定是「malcious」用戶的行爲(他們可能只是發帖子和手動取)。 – Kitsune 2012-08-06 03:21:39