JavaScript防洪水垃圾邮件保护?

JavaScript防洪水垃圾邮件保护?,javascript,spam-prevention,Javascript,Spam Prevention,我想知道是否有可能实施某种粗略的JavaScript防洪保护。 我的代码通过AJAX从服务器接收事件,但有时这些事件可能非常频繁(它们不受我的控制) 我试图想出一种方法来解决这个问题,我写了一个小脚本: 我认为这可以证明对此类攻击有效,但我想知道它是否可以改进或重写 到目前为止,我认为每秒钟超过3或2.5行的一切似乎都是垃圾邮件,但随着时间的推移(因为开始标记已经设置好了…好吧…在开始时),犯罪者可以简单地闲置一段时间,然后开始泛滥,实际上每分钟不会超过1行 此外,我还想补充一点,我使用Moot

我想知道是否有可能实施某种粗略的JavaScript防洪保护。 我的代码通过AJAX从服务器接收事件,但有时这些事件可能非常频繁(它们不受我的控制)

我试图想出一种方法来解决这个问题,我写了一个小脚本:

我认为这可以证明对此类攻击有效,但我想知道它是否可以改进或重写

到目前为止,我认为每秒钟超过3或2.5行的一切似乎都是垃圾邮件,但随着时间的推移(因为开始标记已经设置好了…好吧…在开始时),犯罪者可以简单地闲置一段时间,然后开始泛滥,实际上每分钟不会超过1行

此外,我还想补充一点,我使用Mootools和lodash库(也许它们提供了一些有趣的方法),但如果可以使用原生JS来实现这一点,那就更好了


非常感谢您的任何见解

如果您关心某个特定javascript函数触发的频率,您可以使用该函数

在你的例子中,我想应该是这样的:

onSuccess: function(){ _.debounce(someOtherFunction, timeOut)}; 

其中
timeout
是您希望调用
someOtherFunction
的最大频率。

我知道您询问了有关本机JavaScript的问题,但也许可以看看

RxJS或JavaScript的反应式扩展是一个 转换、组合和查询数据流。我们是指所有人 各种数据,从简单的值数组到一系列事件 (不幸或其他原因),导致复杂的数据流

该页面上有一个示例,它使用
节流
方法“忽略可观察序列中的值,该序列后面紧跟着dueTime之前的另一个值”(请参阅)


有一种类似的方法可以让你每秒2.5-3次,然后忽略其余的事件,直到下一秒。

我花了很多天的时间考虑有效的措施来阻止消息泛滥,直到我在其他地方找到了解决方案

首先,我们需要三件事,惩罚和分数变量,以及最后一个动作发生的时间点:

var score = 0;
var penalty = 200; // Penalty can be fine-tuned.
var lastact = new Date();
接下来,我们通过上一条消息和当前消息之间的时间距离来减少分数

/* The smaller the distance, more time has to pass in order
 * to negate the score penalty cause{d,s}.
 */
score -= (new Date() - lastact) * 0.05; 

// Score shouldn't be less than zero.
score = (score < 0) ? 0 : score;
不要忘记在之后更新最后一个操作:

lastact = new Date();

如果有人向网站发送垃圾邮件,很可能他们不是在使用浏览器(也就是说,他们完全绕过了JavaScript)。在任何情况下,如果有人将粘贴文本复制到输入字段,您的方法要么出现故障,要么认为他们正在试图淹没站点。@Juhana:但我正在接收来自服务器的事件(我无法控制)。那么我真的不明白您想做什么,对不起。如果事件来自服务器,那么keydown事件试图捕获什么?我使用keydown只是为了演示我的意思,它可能是一个简单的函数(实际上是Mootools的onSuccess函数)。也许我不清楚,应该改变它。如果你使用AJAX,你是在请求事件,而不是接收事件。你在说什么?
onSuccess
我使用的函数非常复杂,取决于每个函数的返回输出(事件类型,类似“已连接”、“已断开连接”等)。检查源代码时,对其进行去Boung处理似乎会返回“上次func调用的结果”,这可能会破坏已经脆弱的代码。“已经脆弱的代码”?-听起来是重构的时候了…:)@玛依:哈哈,也许吧。我必须重新发明所有东西,“如果它有效,就不要修复它”在这里有点适用。啊,很公平,你可以按类型分别消除每个事件的影响?
/* The smaller the distance, more time has to pass in order
 * to negate the score penalty cause{d,s}.
 */
score -= (new Date() - lastact) * 0.05; 

// Score shouldn't be less than zero.
score = (score < 0) ? 0 : score;
if ( (score += penalty) > 1000 ) {
   // Do things.
}
lastact = new Date();