【问题标题】:How do you prevent a client from sending a huge websocket packet?如何防止客户端发送巨大的 websocket 数据包?
【发布时间】:2016-10-19 18:27:18
【问题描述】:

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

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

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

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

socket.send(new Array(99999));

发送到服务器的所有这些数据可能会不堪重负,当它到达那里时,带宽已经被使用并且已经被处理。当然有验证,但此时为时已晚,资源已经用于处理它。

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

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

【问题讨论】:

  • 你能把你的套接字放在别的东西里面让它私有
  • 如果你使用Socket.io,那么socket.io-stream之类的工具可以用来切断滥用的连接。
  • @tadman:我使用的是 primus 而不是 socket.io
  • 如果您担心这一点,请不要使用 websocket。 Restful 和其他服务,必须发送一个 Content-Length 属性。我为下一部分道歉,我在这方面的术语和理解正在消失。 Websocket 的存活时间比传统的 Http 协议设计处理的时间要长得多。幸运的是,当 Http 协议达到其最大长度时,服务器会讨论设置另一个同步确认会话。你可以在那里结束它!
  • @user1438893:如何有效测量消息中使用的字节数?

标签: javascript node.js sockets server primus


【解决方案1】:

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

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

【讨论】:

  • 这里的问题是客户端可能是敌对的,例如发送一个永无止境的数组,例如[0,0,0,0...
  • @Steffen Ullrich:你怎么知道你有大量数据?人们是否将数据包串起来并检查长度,或者甚至不打扰,只是希望没有人滥用?我的应用非常随意,所以我怀疑有人会做任何事情,但你永远不知道。
  • @LawrenceDouglas:每个 websocket 帧在开头都包含有关总长度的信息。因此,理论上人们可以在阅读所有内容之前检测到太长的消息。当然,是否可以设置这样的限制取决于框架。
  • @SteffenUllrich:听起来很完美。我想知道是否有办法通过 Primus 访问它。
  • @LawrenceDouglas:简而言之,我会说 primus abstracts 是各种库之上的一个抽象层,并且不提供这种级别的配置。您可能可以将选项传递给底层库以获得更精细的配置。
【解决方案2】:

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

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

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

这只是我能想到的一种潜在解决方案,但您需要按照这些思路想出一些办法。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2014-07-05
    • 2015-08-30
    • 1970-01-01
    • 2016-03-31
    • 2014-03-09
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多