Javascript 如何防止客户端发送巨大的websocket数据包?

Javascript 如何防止客户端发送巨大的websocket数据包?,javascript,node.js,sockets,server,primus,Javascript,Node.js,Sockets,Server,Primus,我正在制作一个webapp,它使用WebSockets在浏览器和节点服务器之间进行通信 如果打开调试控制台(F12),则可以访问套接字实例并对其进行写入 例如,socket.send('packetname','data') 是什么阻止了某人打开控制台写这样的东西 socket.send(新数组(99999)) 所有这些发送到服务器的数据都可能是巨大的,当数据到达服务器时,带宽已经被使用,并且已经被处理。当然会有验证,但现在已经太迟了,资源已经花在了处理上 您也不能只检查数组的长度,因为有人可以

我正在制作一个webapp,它使用WebSockets在浏览器和节点服务器之间进行通信

如果打开调试控制台(F12),则可以访问套接字实例并对其进行写入

例如,
socket.send('packetname','data')

是什么阻止了某人打开控制台写这样的东西

socket.send(新数组(99999))

所有这些发送到服务器的数据都可能是巨大的,当数据到达服务器时,带宽已经被使用,并且已经被处理。当然会有验证,但现在已经太迟了,资源已经花在了处理上

您也不能只检查数组的长度,因为有人可以发送一个数组,其中第一个元素是一个巨大的数组,或者任何真正的数组。我认为没有计算字节大小的方法,所以我想最好的选择是串接数据以检查其大小(这非常慢)


我所有的包都很小。我正在寻找一种防止超过一定大小的数据包被发送到服务器的方法。这是可能的吗?

除非您对客户端拥有完全控制权(您没有),否则您不能阻止客户端向您的系统发送任意大数据。客户端甚至不需要使用浏览器,因此浏览器中的任何限制都不起作用

您只需处理它,例如,如果您获得意外的数据量,请立即断开客户端连接,并可能将源代码列入黑名单,以便下一次攻击尝试可以提前停止。

对此可能没有任何“最佳”解决方案。我只想考虑一下您可以在服务器端实现的东西,以检测是否会发生类似的事情。就在客户端停止客户端而言,很难或可能不可能做到这一点。您的服务器设计为接受连接和数据,因此客户端可以尝试利用这一点

我可以建议的一个可能的解决方案是对客户端在单个操作中发送的数据量设定一个“上限”。我不知道你的应用程序的性质,但考虑到你的应用程序的性质,一个客户端在一次操作中发送
2500字节
的数据可能是完全不可能的

在这种情况下,如果操作(接收的字节)开始超过此上限,则可以断开连接


这是我能想到的唯一可能的解决方案,但是你需要按照这些思路想出一些办法。

你能把你的套接字放在别的东西里面让它成为私有的吗?如果你使用的话,像这样的工具可以用来切断滥用的连接。@tadman:我用的是primus而不是socket。如果你担心这个问题,就不要使用websocket。Restful和其他服务必须发送内容长度属性。我为下一部分道歉,我在这方面的术语和理解正在消失。WebSocket的使用寿命比传统Http协议设计用来处理的时间长得多。幸运的是,当Http协议达到最大长度时,服务器会讨论设置另一个syn ack会话。你可以到此为止@user1438893:如何有效地测量消息中使用的字节数?这里的问题是,客户端可能会怀有敌意,并发送一个像
[0,0,0,0…
@Steffen Ullrich:你怎么知道你得到了大量的数据?人们会把数据包串起来检查长度吗?或者甚至不麻烦,只是希望没有人滥用?我的应用程序很随意,所以我怀疑有人会做任何事情,但你永远不会知道。@LawrenceDouglas:每个websocket框架都包含关于to的信息一开始的总长度。因此,理论上,人们可以在阅读所有内容之前发现过长的信息。当然,如果你能设置这样的限制,这取决于框架。@SteffenUllrich:听起来很完美。我想知道是否有一种方法可以通过Primus访问这些信息。@LawrenceDouglas:从一个简短的角度看,我会说Primus abstracts太多了不同库上的抽象层,不提供此级别的配置。可能是您可以将选项传递给底层库以获得更细粒度的配置。