57 votes

Comment se protéger contre les attaques de déni de service distribuées dans Node.js avec Socket.io?

J'ai appris node.js et socket.io récemment. Ma question est de savoir comment puis-je protéger le serveur contre les attaques côté client?

Ceci est mon code serveur

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

Par exemple, si un client utilise des outils de développement Chrome pour exécuter le code fluide

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

ça va tuer le serveur.

29voto

Keo Strife Points 307

Regarder en JS limitation des événements et de l'anti-rebond!

Ces techniques vous aideront à prévenir et à détecter les attaques à un certain point (qui est, à mon avis, suffisant pour une petite multijoueur prise de jeu)... je voudrais juste débrancher cette prise s'ils attaquent, lol!

Si vous êtes intéressé par un exemple de code, laissez-moi savoir

EDIT:

Dans ce 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:
    }
}());

vous pouvez voir que chaque demande envoyée plus rapidement que 5ms retournera false, sinon le gestionnaire d'obtenir de l'exécuter.

Vous simple de débrancher les prises qui envoyer la demande plus rapide que 5ms (ou 2ms, ou 3ms en fonction de votre réseau et de votre application, de poids...).

Vous pourriez aussi bien utiliser js limitation des événements sur le site du client afin de s'assurer que toutes vos demandes de ne pas envoyer plus vite que la limite de vitesse! http://drupalmotion.com/article/debounce-and-throttle-visual-explanation.

Cette technique ne fournira pas une protection absolue contre l'exploitation, mais il empêchera votre serveur à partir de la plante lorsque les pirates essaient de DDos il...

1voto

Matt617 Points 256

Étant donné que le nœud n'est pas le "meilleur" à la manipulation de ces DDoS Conditions dans le cadre lui-même, je donnerais troisième partie DDoS Mitigation des tactiques telles que cloudflare ou blacklotus. Ils sont coûteux offres si vous avez une énorme ampleur de l'utilisation, mais ils vont protéger Nœud ou vraiment tout cadre d'attaques par déni de service.

https://www.cloudflare.com

http://www.blacklotus.net/

Une autre option est d'utiliser le logiciel de pare-feu basé sur des solutions comme aiProtect qui sont un peu plus rentable lors de la mise à l'échelle passé le niveau gratuit de cloudflare et blacklotus.

http://aiscaler.com/home/protect

Il ya beaucoup plus là-bas, mais celui-ci arrive à avoir une AWS partenariat de sorte que vous pouvez facilement faire tourner aiProtect VMs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X