在js中调用emit

时间:2017-10-05 21:58:27

标签: javascript node.js socket.io eventemitter

如果发射器没有任何已注册的侦听器,我会试图回答会发生什么。

如果客户端在没有任何侦听器的情况下通过spaming进行spaming,是否会导致漏洞?

while(true){
    socket.emit('not_registered_event_string');
}

1 个答案:

答案 0 :(得分:1)

如果你.emit()没有任何听众,它不会导致任何问题。 EventEmitter对象将仅检查您传入的消息名称以获取侦听器列表,并且将找不到任何内容,因此将不执行任何操作。

但是,这个循环在服务器中:

while(true){
    socket.emit('not_registered_event_string');
}

是一个无限循环,会阻止你的node.js进程执行其他任何操作。它将永远停留在该循环中,并且无法处理任何其他事件或执行任何其他操作。

这是因为node.js在单个线程中运行您的Javascript,只要该单个线程在您的上述while循环中循环,它就不能处理任何其他消息或执行任何其他操作。 node.js是一个事件驱动的环境。您收到一个事件,您处理事件,您将控制权返回给系统,然后系统可以处理下一个事件。如果你永远循环,那么没有任何事件被处理,你的node.js进程将显示为挂起(即使你的循环可能仍在运行)。

客户端中的同一个循环只会向您的服务器发送大量消息。服务器可能很好地处理它们,因为如果没有监听器,它们在接收时基本上没什么可做的。但是,它会从处理空消息的服务器中抢夺带宽和CPU。

如果您想保护您的服务器免受客户端垃圾邮件事件的影响,您可以"速率限制"一个客户端,如果它超过每秒一定的消息速率或每分钟的消息,你可以放弃它的连接。速率限制是一个很好的研究主题,许多文章已经写过,并且有许多方案,其中node.js的预构建包有助于实现速率限制。我读过的一个常见问题是"leaky bucket" algorithm

速率限制是服务器保护自己免受恶意客户端攻击的常见方式。如果继续滥用,您甚至可能会暂停或撤消对您网站的帐户访问权限,因此该帐户甚至无法登录您的网站。像Google这样的人对大多数(可能是所有)服务使用速率限制来保护他们免受意外或有目的的过载攻击。