如何使用Socket.io保护Node.js中的分布式拒绝服务攻击?

我最近一直在学习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'});
 }

它会杀死服务器。

Virushan asked 2020-07-12T19:40:33Z
4个解决方案
20 votes

研究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:
    }
}());

您会看到每个发送速度超过5ms的请求都将返回false,否则处理程序将运行。

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

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

这项技术不会提供绝对的保护以防止被利用,但是它将防止您的服务器在攻击者尝试执行Dos时崩溃。

Keo Strife answered 2020-07-12T19:41:18Z
4 votes

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变得高度可用且快速。

Animir answered 2020-07-12T19:41:47Z
3 votes

在您的http服务器中执行此操作并非总是一个好主意。 检查以下答案:如何防止对以node.js编写的http服务器进行DOS攻击?

Luca Steeb answered 2020-07-12T19:42:07Z
1 votes

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

[HTTPS://呜呜呜.cloud flare.com]

[HTTP://呜呜呜.black lotus.net/]

另一个选择是使用基于软件的防火墙解决方案,例如aiProtect,在扩展到cloudflare和blacklotus的免费层时,其成本效益更高。

[HTTP://爱scaler.com/home/protect]

还有更多的东西,但是这恰好是一种AWS合作伙伴关系,因此您可以轻松启动aiProtect VM。

Matt617 answered 2020-07-12T19:42:50Z
translate from https://stackoverflow.com:/questions/20435553/how-to-protect-against-distributed-denial-of-service-attacks-in-node-js-with-soc