Как увеличить период блокировки после ограничения скорости, используя express -rate-limit в Node js? - PullRequest
0 голосов
/ 02 мая 2020

Библиотека express-rate-limit будет блокировать соединения от клиента (скажем, идентифицированные по IP) после превышения определенного количества запросов за единицу времени. Он также блокирует соединения на время, эквивалентное единице времени.

Итак, если он настроен на блокировку соединений после 120 запросов в минуту; это также заблокирует IP на минуту. Как я могу продлить время блокировки?

Вот мой текущий пример:

...

var express = require('express');
var app = express();

const RateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');

limiter = new RateLimit({
  store: new RedisStore({
    expiry: 60
  }),
  max: 120
});

app.use(limiter);
...

Здесь я также использую rate-limit-redis, его параметр expiry перезаписывает параметр windowMs express-rate-limit.

1 Ответ

0 голосов
/ 02 мая 2020

Используя обратный вызов onLimitReached, вы можете вести учет времени, когда IP-адрес снова разблокируется. Затем вы можете написать другое промежуточное программное обеспечение, которое проверяет, когда достигнута дата разблокировки.

В приведенном ниже примере bannedIPs ведет запись времени, когда IP-адрес снова разблокируется, а banner - это промежуточное ПО, которое использует время для блокировки IP-адреса в соответствии с текущей датой.

...

var express = require('express');
var app = express();

const RateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');

// Keep the IPs that are banned
const bannedIPs = {};

limiter = new RateLimit({
  store: new RedisStore({
    expiry: 60
  }),
  onLimitReached: function(req, res, options) {

    // The IP will be unblocked again in an hour (60*60*1000)
    bannedIPs[req.ip] = +new Date() + 60*60*1000;

  },
  max: 120
});

banner = function(req, res, next) {
  // If the current Date is still before than the unblocking date, 
  // send a 429 message indicating too many requests
  if (bannedIPs[req.ip] >= +new Date()) {
    res.status(429).send("Sorry, too many requests: " + new Date(bannedIPs[req.ip]));
  } else {
    next();
  }
}

app.use(banner);
app.use(limiter);
...

Существует много возможностей для улучшения, например, удаление IP-адресов, когда они больше не блокируются, и, возможно, хранение ключей в Redis, чтобы они были постоянными после перезапуска сервера. Но это даст вам отправную точку.

...