【问题标题】:How to prevent DOS attacks on my http server which written in node.js?如何防止对我用 node.js 编写的 http 服务器的 DOS 攻击?
【发布时间】:2012-01-26 11:15:40
【问题描述】:

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

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

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

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

socket.destroy();

来自 API:

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

有什么区别和好处?

【问题讨论】:

  • 为什么不使用防火墙来限制最大连接数?

标签: javascript node.js security ddos


【解决方案1】:

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

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

【讨论】:

  • 有人建议在自动登录 cookie 最佳实践中使用随机令牌作为标识符,因为它可以防止 DoS。他们似乎不同意你的做法。 :)
  • “一旦请求到达它,攻击者就通过占用连接(无论多短)‘获胜’。”嗯,这取决于这是什么类型的服务器以及它存在的目的。
【解决方案2】:

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

 server.pause(msecs)

停止接受给定号码的连接 毫秒(默认为一秒)。这可能对 限制针对 DoS 攻击或其他攻击的新连接 超额认购。

【讨论】:

    【解决方案3】:

    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
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 2018-12-27
      • 2016-09-17
      • 2016-09-12
      • 2011-04-04
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多