2013-12-06 3 views
40

Я изучал node.js и socket.io в последнее время. Мой вопрос: как защитить сервер от атак на стороне клиента?Как защитить от распространенных атак типа «отказ в обслуживании» в 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'}); 
} 

его собираются убить сервер.

+2

Если это действительно убивает ваш сервер, вы должны, вероятно, внедрить какой-то дросселирование на основе клиентов и т. Д. – adeneo

+0

Узел 0.10.20 имеет проблемы с DoS, если вы используете его (или, ниже, я думаю). – gustavohenke

+3

Почему вы не показываете конечную точку сокета узла с помощью службы защиты/дросселирования DoS? Я уверен, что cloudflare или аналогичный провайдер будет иметь очень хорошую защиту DoS, а не попытку опрокинуться. – amarprabhu

ответ

14

Посмотрите на дросселирование и дебатирование JS!

Эти методы помогут вам предотвратить и обнаружить атаки до определенной точки (что, на мой взгляд, достаточно для небольшой многопользовательской игры сокетов) ... Я бы просто отключил этот сокет, если они атакуют, lol!

Если вы заинтересованы в образце кода, дайте мне знать

EDIT:

В этом 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-событий на клиентском сайте, чтобы убедиться, что все ваши запросы не отправляются быстрее, чем ограничение скорости! http://drupalmotion.com/article/debounce-and-throttle-visual-explanation.

Этот метод не обеспечивает абсолютную защиту от эксплуатации, но это предотвратит ваш сервер от сбоев, когда злоумышленники пытаются Дос ...

+0

было бы здорово, если бы вы могли показать мне пример кода. спасибо – Virushan

+0

Я быстро написал образец кода и отредактировал свой ответ ... Этот метод очень ситуативен по размеру вашего приложения ... Вы должны переписать его после того, как вы поймете, как это работает. По крайней мере, это работает ... и это не стоит! лол! –

+0

«Когда злоумышленники пытаются DDos это», разве вы не имеете в виду DoS? :) –

1

Учитывая, что этот узел не является «лучшим» при обработке таких условий DDoS в рамках самой структуры, я бы рассмотрел тактику DDoS с уменьшенной частью, такую ​​как cloudflare или blacklotus. Они являются дорогостоящими предложениями, если у вас есть огромные масштабы использования, но они будут защищать узел или действительно любую инфраструктуру от атак типа «отказ в обслуживании».

https://www.cloudflare.com

http://www.blacklotus.net/

Другой вариант заключается в использовании программных решений на основе межсетевого экрана, как aiProtect, которые немного более рентабельным при масштабировании за свободный ярусе CloudFlare и BlackLotus.

http://aiscaler.com/home/protect

Есть еще много там, но это один случается иметь партнерства AWS, так что вы можете легко раскручивается aiProtect виртуальных машин.

+0

Также обратите внимание, если вы хотите запускать websockets с помощью cloudflare или этих сервисов, он стоит тысячи в месяц. –

+0

Это хорошо, но они не блокируют атаки «простого DDoS», как пример из @Virushan. –

Смежные вопросы