diff --git a/src/middleware/index.js b/src/middleware/index.js index 511ae1ddd4..d7f1ce1a73 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -9,6 +9,7 @@ var nconf = require('nconf'); var ensureLoggedIn = require('connect-ensure-login'); var toobusy = require('toobusy-js'); var Benchpress = require('benchpressjs'); +var LRU = require('lru-cache'); var plugins = require('../plugins'); var meta = require('../meta'); @@ -23,6 +24,10 @@ var controllers = { helpers: require('../controllers/helpers'), }; +var delayCache = LRU({ + maxAge: 1000 * 60, +}); + var middleware = module.exports; middleware.applyCSRF = csrf(); @@ -186,6 +191,14 @@ middleware.processTimeagoLocales = function (req, res, next) { middleware.delayLoading = function (req, res, next) { // Introduces an artificial delay during load so that brute force attacks are effectively mitigated + + // Add IP to cache so if too many requests are made, subsequent requests are blocked for a minute + var timesSeen = delayCache.get(req.ip) || 0; + if (timesSeen > 10) { + return res.sendStatus(429); + } + delayCache.set(req.ip, timesSeen += 1); + setTimeout(next, 1000); };