6

使用 node.js,构建一个可以处理 http 请求的 tcp 服务器的 net 模块。

我想防止dos攻击,所以我所做的是这样的:

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

我想知道使用它是否更好:

socket.destroy();

来自 API:

socket.destroy() # 确保此套接字上不再发生 I/O 活动。仅在出现错误时才需要(解析错误左右)。

有什么区别和好处?

4

3 回答 3

34

DOS 攻击确实不应该由您的 HTTP 服务器处理。一旦请求到达它,攻击者就通过占用连接(无论多短)“获胜”。即使它们很短,它们也可以以数千/秒的速度猛击它并阻止其他任何人连接。此外,他们可能不会尝试通过 TCP 进行“连接”,而只是向服务器发出各种请求。

在较低级别或通过防火墙阻止/检测 DOS 攻击,我相信许多软件和硬件版本都支持一些基本类型的 DOS 检测和预防。

于 2011-12-22T22:47:06.267 回答
3

如果它对任何人有帮助,应该从 API 中巧妙地使用:

 server.pause(msecs)

在给定的毫秒数内停止接受连接(默认为一秒)。这对于限制针对 DoS 攻击或其他超额订阅的新连接可能很有用。

于 2011-12-26T23:01:10.413 回答
2

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
};
于 2014-03-25T02:04:26.897 回答