通过JS实现消息洪水保护

时间:2015-11-30 21:46:55

标签: javascript protection

我目前正在运行服务器。我编写的机器人目前为主持人提供管理工具,但我希望机器人内置一些自动防洪系统。

因此,我可以访问用户发送的每条消息,发送消息的用户的名称以及时间他们发了短信。我不确定如何制作系统,是否有人有任何想法?我希望能够为服务器中的每个用户调节防洪保护。

1 个答案:

答案 0 :(得分:1)

创建一个以用户名为主的地图。每个用户的值应该是长度为n的圆形数组(例如十个)。每个循环数组的内容应该是请求的时间戳。

在每个入站请求中,从该数组中获取该用户名的n项。从performance.now()中减去它,然后进行数学运算以查看该速率是否可接受。如果没有,请执行no-op,或返回HTPP错误代码。

以下代码仅供参考,并不具备实用性。

var Q_LENGTH = 10;
var MAX_REQUEST_RATE = 1; // per second
var requestTimeMap = {};

function onRequest(username, timestamp) {
  recordReq(username);
  if(tooFast(username)) {
      // return HTTP 40x
  }

  // service the request
}

function recordReq(username) {
  requestTimeMap[username] = requestTimeMap.username || createCircularQ(Q_LENGTH); 
  requestTimeMap[username].unshift(performance.now())
}

function tooFast(username) {
  return ((performance.now() - (requestTimeMap[username][Q_LENGTH] || 0)) / Q_LENGTH) > (1000 / MAX_REQUEST_RATE);
}

function createCircularQ(length) {
  var circularQueue = [];    
  circularQueue.unshift = function(element) {
    if (this.length === length) {
      this.pop();
    }
    return Array.prototype.unshift.call(this, element);
  }
  return circularQueue;
}