如何通过Socket.io防止Node.js中的分布式拒绝服务攻击?

我最近一直在学习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开发工具来执行stream动的代码

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

它将杀死服务器。

看看JS事件节stream和反弹!

这些技术将帮助你防止和检测攻击到某一点(在我看来,这对于一个小型多人套接字游戏是足够的)…我只是断开连接,如果他们正在攻击,哈哈!

如果你对示例代码感兴趣,请告诉我

编辑:

在这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毫秒,取决于您的networking和应用程序的重量…)。

你也可以在客户端使用js event throttling来确保你的所有请求都不会超出限制速度! http://drupalmotion.com/article/debounce-and-throttle-visual-explanation

这种技术不能为攻击提供绝对的保护,但是当攻击者尝试使用Dos时,它将防止服务器崩溃。

在你的http服务器上这样做并不总是一个好主意。 检查这个答案: 如何防止我的http服务器写在node.js的DOS攻击?

鉴于这个节点在处理这种DDoS条件的时候并不是“最好的”,所以我会研究第三部分DDoS的缓解策略,比如cloudflare或者blacklotus。 如果您拥有巨大的使用范围,那么它们是昂贵的产品,但它们将保护Node或真正的框架免受拒绝服务攻击。

https://www.cloudflare.com

http://www.blacklotus.net/

另一个select是使用基于软件的防火墙解决scheme,比如aiProtect,在扩展免费级别的cloudflare和blacklotus时,性价比更高。

http://aiscaler.com/home/protect

还有更多,但是这恰好有一个AWS伙伴关系,所以你可以轻松地启动aiProtect虚拟机。