Javascript 限制速率以防止ExpressJS中的恶意行为

Javascript 限制速率以防止ExpressJS中的恶意行为,javascript,node.js,rate-limiting,express,Javascript,Node.js,Rate Limiting,Express,有人让我意识到我正在开发的应用程序中存在一些缺陷(主要是在前端的JavaScript中),这使得一次点击大量按钮并发送大量事务性电子邮件成为可能。这显然不好 我认为在ExpressJS中处理这个问题的一种方法是使用app.all()来计算在特定时间段内发生的请求数。我会用时间戳将其存储在会话元数据中,如果Y时间内发生了超过X个请求,我会将它们切断一段时间,直到限制到期 以前有没有人这样做过,或者有什么提示/提示可以帮助我?我的应用程序最好是能够轻松进出的。谢谢 您可以使用网页中的Collate对

有人让我意识到我正在开发的应用程序中存在一些缺陷(主要是在前端的JavaScript中),这使得一次点击大量按钮并发送大量事务性电子邮件成为可能。这显然不好

我认为在ExpressJS中处理这个问题的一种方法是使用
app.all()
来计算在特定时间段内发生的请求数。我会用时间戳将其存储在会话元数据中,如果Y时间内发生了超过X个请求,我会将它们切断一段时间,直到限制到期


以前有没有人这样做过,或者有什么提示/提示可以帮助我?我的应用程序最好是能够轻松进出的。谢谢

您可以使用网页中的
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);
    });
};

处理这一问题的最佳方法是确保电子邮件是非阻塞的,而不是事务性的。像这样的客户端解决方案只能防止用户的意外操作,但不一定是“恶意”用户的操作(他们可以只发送帖子并手动获取)。