簡體   English   中英

如何防止在我的http服務器上用node.js寫的DOS攻擊?

[英]How to prevent DOS attacks on my http server which written in node.js?

使用node.js,用於構建可以處理http請求的tcp服務器的網絡模塊。

我想防止dos攻擊,所以我做的是這樣的事情:

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

我想知道它是否更好用:

socket.destroy();

來自API:

socket.destroy()#確保此套接字上不再發生I / O活動。 僅在出現錯誤時才需要(解析錯誤等)。

有什么區別和好處?

您的HTTP服務器實際上不應該處理DOS攻擊。 一旦請求到達它,攻擊者通過建立連接(無論多短)就“贏了”。 即使它們很短,也可以用數千/秒的時間猛擊它並防止其他人連接。 此外,他們可能不會嘗試通過TCP“連接”,只是使用各種請求充斥服務器。

在較低級別或通過防火牆阻止/檢測DOS攻擊,我相信很多軟件和硬件版本都支持一些基本類型的DOS檢測和防護。

如果API能幫助任何人,應該巧妙地使用它:

 server.pause(msecs)

停止接受給定毫秒數的連接(默認為一秒)。 這可能有助於限制針對DoS攻擊或其他超額訂閱的新連接。

Total.js框架: 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
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM