【问题标题】:How to protect against distributed denial-of-service attacks in Node.js with Socket.io?如何使用 Socket.io 防止 Node.js 中的分布式拒绝服务攻击?
【发布时间】:2013-12-24 11:48:48
【问题描述】:

我最近一直在学习 node.js 和 socket.io。我的问题是如何保护服务器免受客户端攻击?

这是我的服务器代码

io.sockets.on('connection', function (socket) { 
//users.push(socket);       
socket.on('message', function (data) {      

    socket.on('disconnect', function () { });           

    socket.on('bcast', function (data) {        
        socket.emit('news', { 'data': data });
        socket.broadcast.emit('news', { 'data': data });     
    });

    socket.on('login', function(data){
      socket.emit('login', {'data': [ socket.id, data ] });
    });
   });
 });

例如,如果客户使用 chrome 开发者工具来做流动代码

 for(var i = 0; i<99999999999; i++)
 {
        socket.emit('bcast', {data: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
 }

它会杀死服务器。

【问题讨论】:

  • 如果这真的会杀死您的服务器,您可能应该基于客户端等实施某种限制。
  • Node 0.10.20 有已知的 DoS 问题,如果你正在使用它(或者更低,我认为)。
  • 为什么不使用 DoS 保护/限制服务公开节点套接字端点?我相信 cloudflare 或类似的提供商会提供非常好的 DoS 保护,而不是您自己尝试推出。
  • 非常好的问题,没有好的答案!
  • 也许你把问题发挥到了极致。像这样暴露/滥用 bcast 是不好的。如果您过多地使用广播,您的服务器甚至会在您的用户进行 DDOS 之前停止运行。你为什么不通过将广播与单发射不同来测试你的场景。以房间为例。仅在需要时使用广播。

标签: node.js socket.io ddos


【解决方案1】:

研究 JS 事件限制和去抖动!

这些技术将帮助您在一定程度上预防和检测攻击(在我看来,这对于小型多人套接字游戏来说已经足够了)...

编辑:

在这个 jsfiddle 中:http://jsfiddle.net/y4tq9/9/

var sIO = {};

sIO.on = (function(){
    var messages = {};
    var speedLimit = 5; //5ms
    return function(message, handler) {
        messages[message] = messages[message] || {};
        if(messages[message].timestamp && new Date().getTime() - messages[message].timestamp < speedLimit) return false;
        else messages[message].timestamp = new Date().getTime();

        handler();
        return true;
        //execute code, Ex:
    }
}());

您可以看到,每个发送速度快于 5 毫秒的请求都将返回 false,否则处理程序将运行。

您只需断开发送请求速度超过 5 毫秒(或 2 毫秒或 3 毫秒,具体取决于您的网络和应用程序的权重...)的套接字。

您不妨在客户端站点上使用 js 事件限制,以确保您的所有请求都不会发送超过速度限制!

这种技术不会提供绝对的保护免受利用,但它会防止您的服务器在攻击者尝试 Dos 时崩溃...

【讨论】:

  • 我很快写了一个示例代码并编辑了我的答案...这种技术非常适合您的应用程序的大小...您应该在了解它的工作原理后重写它。至少它有效......而且它不花费!大声笑!
  • '当攻击者尝试 DDos 时',你不是说 DoS 吗? :)
  • 我删除了损坏的链接,如果您需要有关该技术的更多信息,请查看“事件限制”
【解决方案2】:

rate-limiter-flexible Node.js 包可用于抵御 DDoS 攻击。

const { RateLimiterMemory } = require('rate-limiter-flexible');

const rateLimiter = new RateLimiterMemory({
  points: 5, // 5 points
  duration: 1 // per second
});

socket.on('bcast', data => {
  rateLimiter.consume(uniqueSocketId) // consume 1 point per event
    .then(() => {
      socket.emit('news', { 'data': data });
      socket.broadcast.emit('news', { 'data': data });
    })
    .catch(rejRes => {
      // no available points to consume
      // emit error or another workaround
    });
});

如果每秒发生超过 5 次,任何事件都将被阻止。

还有使用 Redis 的分布式应用程序的选项。 一些灵活的设置,如保险和阻止策略,使rate-limiter-flexible 具有高可用性和快速性。

【讨论】:

    【解决方案3】:

    在您的 http 服务器中执行此操作并不总是一个好主意。检查这个答案:How to prevent DOS attacks on my http server which written in node.js?

    【讨论】:

      【解决方案4】:

      鉴于该节点不是在框架本身内处理此类 DDoS 条件的“最佳”节点,我将研究第三方 DDoS 缓解策略,例如 cloudflare 或 blacklotus。如果您的使用规模很大,它们是昂贵的产品,但它们将保护 Node 或实际上任何框架免受拒绝服务攻击。

      https://www.cloudflare.com

      http://www.blacklotus.net/

      另一种选择是使用基于软件的防火墙解决方案,例如 aiProtect,当扩展到超过 cloudflare 和 blacklotus 的免费层时,它更具成本效益。

      http://aiscaler.com/home/protect

      还有更多,但这个恰好与 AWS 建立了合作伙伴关系,因此您可以轻松启动 aiProtect 虚拟机。

      【讨论】:

      • 另请注意,如果您想使用 cloudflare 或这些服务运行 websocket,则每月要花费数千美元。
      • 这很好,但它们不会像@Virushan 给出的示例那样阻止“简单 DDoS”攻击。
      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多