Как предотвратить DOS-атаки на мой http-сервер, которые написаны в node.js? - PullRequest
4 голосов
/ 23 декабря 2011

используя node.js, сетевой модуль для построения tcp-сервера, который может обрабатывать http-запросы.

Я бы хотел предотвратить дос-атаки, так что я сделал что-то вроде этого:

if (status.numOfCurrentRequests + 1 >= MAX_NUM_OF_CONNECTIONS) {
    socket.end();
    return; 
}

Мне было интересно, лучше ли использовать:

socket.destroy();

из API:

socket.destroy () # Гарантирует, что с этим больше не будет операций ввода-вывода разъем. Требуется только в случае ошибок (ошибка разбора или около того).

в чем различия и преимущества?

Ответы [ 4 ]

27 голосов
/ 23 декабря 2011

DOS-атака действительно не должна обрабатываться вашим HTTP-сервером. Как только запрос достиг его, злоумышленник «выиграл», установив соединение (независимо от того, насколько коротким). Даже если они короткие, они могут просто грохнуть его тысячами в секунду и помешать кому-либо еще подключиться. Кроме того, они могут не пытаться «подключиться» через TCP, а просто залить сервер всеми видами запросов.

Блокировка / обнаружение DOS-атак на более низком уровне или через брандмауэр, который, я уверен, многие версии программного и аппаратного обеспечения поддерживают некоторые основные типы обнаружения и предотвращения DOS.

3 голосов
/ 27 декабря 2011

из API, если это кому-либо помогает, следует использовать с умом:

 server.pause(msecs)

Прекратить прием соединений на указанное количество миллисекунд (по умолчанию одна секунда).Это может быть полезно для ограничения новых подключений против DoS-атак или других переподписок.

2 голосов
/ 25 марта 2014

Total.js Framework: https://github.com/totaljs/modules/blob/master/ddos/ddos.js

var counter = 0;
var ip = {};
var ban = {};
var ban_length = 0;
var interval = 0;
exports.install = function () {
    framework.onRequest = function (req, res) {
        if (ban_length > 0 && ban[req.ip]) {
            req.connection.destroy();
            return true
        }
        var count = (ip[req.ip] || 0) + 1;
        ip[req.ip] = count;
        if (count === 1) counter++;
        if (count < exports.options.maximum) return false;
        ban[req.ip] = exports.options.minutes + 1;
        ban_length++;
        return true
    };
    setInterval(function () {
        interval++;
        var keys;
        var length;
        var count;
        if (ban_length > 0 && interval % 60 === 0) {
            keys = Object.keys(ban);
            length = keys.length;
            count = 0;
            for (var i = 0; i < length; i++) {
                var key = keys[i];
                if (ban[key]-- > 0) continue;
                ban_length--;
                delete ban[key]
            }
            if (ban_length < 0) ban_length = 0
        }
        if (counter <= 0) return;
        keys = Object.keys(ip);
        length = keys.length;
        counter = length;
        for (var i = 0; i < length; i++) {
            var key = keys[i];
            var count = ip[key]--;
            if (count > 0) continue;
            counter--;
            delete ip[key]
        }
        if (counter < 0) counter = 0
    }, 1e3)
};
exports.usage = function () {
    return {
        bans: ban_length
    }
};
exports.options = {
    maximum: 1e3,
    minutes: 5
};
0 голосов
/ 28 декабря 2018

Используется ограничителя экспресс-скорости, чтобы избежать DOS-атак

Установка npm install --save express-rate-limit

Пример использования, который

var RateLimit = require('express-rate-limit');

app.enable('trust proxy'); // only if you're behind a reverse proxy (Heroku, Bluemix, AWS if you use an ELB, custom Nginx setup, etc) 

var limiter = new RateLimit({
  windowMs: 15*60*1000, // 15 minutes 
  max: 100, // limit each IP to 100 requests per windowMs 
  delayMs: 0 // disable delaying - full speed until the max limit is reached 
});

//  apply to all requests 
app.use(limiter);
...