node.js socket.io ddos

¿Cómo protegerse contra los ataques distribuidos de denegación de servicio en Node.js con Socket.io?



ddos (4)

¡Mire el estrangulamiento y el antirrebote de eventos JS!

Esas técnicas te ayudarán a prevenir y detectar ataques hasta cierto punto (que es, en mi opinión, suficiente para un pequeño juego de socket multijugador) ...

EDITAR:

En este 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: } }());

puede ver que cada solicitud enviada a más de 5 ms devolverá falsa; de lo contrario, se ejecutará el controlador.

Simplemente desconecte los enchufes que envían solicitudes a más de 5ms (o 2ms, o 3ms dependiendo de su red y el peso de su aplicación ...).

¡También podría utilizar el jasificación de eventos js en el sitio del cliente para asegurarse de que todas sus solicitudes no se envíen más rápido que el límite de velocidad!

Esta técnica no brindará protección absoluta contra la explotación, pero evitará que su servidor se bloquee cuando los atacantes intenten Dos ...

He estado aprendiendo node.js y socket.io últimamente. Mi pregunta es ¿cómo puedo proteger el servidor de los ataques del lado del cliente?

Este es mi código de servidor

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

Por ejemplo, si un cliente usa las herramientas de desarrollador de Chrome para hacer el código que fluye

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

va a matar el servidor.


Dado que el nodo no es el "mejor" en el manejo de tales condiciones DDoS dentro del marco mismo, examinaría las tácticas de mitigación DDoS de tercera parte, como cloudflare o blacklotus. Son ofertas costosas si tiene una gran escala de uso, pero protegerán Nodo o realmente cualquier marco de ataques de denegación de servicio.

https://www.cloudflare.com

http://www.blacklotus.net/

Otra opción es utilizar soluciones de firewall basadas en software como aiProtect que son un poco más rentables cuando se escala más allá del nivel libre de cloudflare y blacklotus.

http://aiscaler.com/home/protect

Hay muchos más por ahí, pero este tiene una asociación de AWS, por lo que puede activar fácilmente las máquinas virtuales de aiProtect.



rate-limiter-flexible biblioteca rate-limiter-flexible nodejs se puede usar contra ataques DDoS

const { RateLimiterMemory } = require(''rate-limiter- flexible''); const rateLimiter = new RateLimiterMemory( { points: 5, // 5 points duration: 1, // per second }); socket.on(''bcast'', function (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 }); });

Cualquier evento será bloqueado, si ocurre más de 5 veces por segundo.

También hay una opción para aplicaciones distribuidas usando Redis. Y algunas configuraciones flexibles como seguros y estrategias de bloqueo que hacen rate-limiter-flexible alta disponibilidad y rápido.