如何使用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'});
 }

它会杀死服务器。

查看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,否则处理程序将运行。

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

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

这项技术不会提供绝对的保护来防止被利用,但它可以防止攻击者试图攻击时服务器崩溃。。。

速率限制器灵活的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具有高可用性和快速性。

在http服务器中这样做并不总是一个好主意。检查这个答案:如何防止DOS对我用node.js编写的http服务器的攻击?

鉴于该节点在框架内并非"最擅长"处理此类DDoS条件,我将研究第三部分DDoS缓解策略,如cloudflare或blacklotus。如果您有大规模的使用,它们是昂贵的产品,但它们将保护Node或任何框架免受拒绝服务攻击。

https://www.cloudflare.com

http://www.blacklotus.net/

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

http://aiscaler.com/home/protect

还有很多,但这一个恰好有AWS合作伙伴关系,因此您可以轻松地启动aiProtect虚拟机。

最新更新