Подтвердить что ты не робот

Как защитить от распространенных атак типа "отказ в обслуживании" в 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 ] });
    });
   });
 });

Например, если клиент использует хром-инструменты для создания кода

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

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

4b9b3361

Ответ 1

Посмотрите на дросселирование и debouncing событий 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.

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

Ответ 3

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

https://www.cloudflare.com

http://www.blacklotus.net/

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

http://aiscaler.com/home/protect

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