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

有人让我意识到我正在开发的一个应用程序中的一些缺陷(主要是在我的前端的JavaScript中),这就使得我们可以立即点击大量的button并发送大量的事务电子邮件。 这显然不好。

我想在ExpressJS中处理这个问题的一个方法是使用app.all()来计算在特定时间范围内发生的请求的数量。 我会把它存储在带有时间戳的会话元数据中,如果在Y时间内发生超过X个请求,我将它们closures一段时间,直到限制到期。

有没有人以前做过或有任何提示/提示来帮助我? 一些容易进出我的应用程序是可取的。 谢谢!

你可以在你的网页中使用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();"> 

如果您预期会发生多次事件,只想对上次触发事件做出反应。 就像在用户input完毕后要search一样,您可以这样做:

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