Как защитить от распространенных атак типа "отказ в обслуживании" в 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'});
}
его собирается убить сервер.
Ответы
Ответ 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...
Ответ 2
Это не всегда хорошая идея сделать это на вашем http-сервере. Проверьте этот ответ: Как предотвратить атаки DOS на моем http-сервере, написанном в node.js?
Ответ 3
Учитывая, что node не является "лучшим" при обработке таких условий DDoS внутри самой структуры, я бы рассмотрел тактику DDoS с минимальной частью, такую как cloudflare или blacklotus. Это дорогостоящие предложения, если у вас огромный объем использования, но они будут защищать node или действительно любую инфраструктуру от атак типа "отказ в обслуживании".
https://www.cloudflare.com
http://www.blacklotus.net/
Другим вариантом является использование программных решений для брандмауэра, таких как aiProtect, которые немного более экономичны при масштабировании за свободным уровнем облачности и черным шрифтом.
http://aiscaler.com/home/protect
Есть много других, но у этого есть партнерство AWS, поэтому вы можете легко развернуть виртуальные машины aiProtect.