如何限制龙卷风 websocket 消息大小

Posted

技术标签:

【中文标题】如何限制龙卷风 websocket 消息大小【英文标题】:how to limit tornado websocket message size 【发布时间】:2017-11-22 14:30:44 【问题描述】:

我在 tornado 中编写了一个 websocket 服务器,并在收到消息时调用 on_message 方法。问题是,默认情况下消息大小是无限的,换句话说,通过从客户端向 websocket 发送大量数据(消息)来打开项目以进行攻击,这会使服务器端内存满。必须有一个选项来限制传入消息的大小,是吗?如果没有,我必须怎么做才能避免此类错误?这是我的代码,用于获取长度小于 128 字节的消息,但它似乎不起作用。

class ClientWebSocketConnectionHandler(tornado.websocket.WebSocketHandler):

    def open(self):
        print "Connection is opened"

    def on_message(self, message):
        print message

    def on_close(self):
        print "closed"

handlers = [(r'/', ClientWebSocketConnectionHandler)]
tornado.web.Application.__init__(self, handlers)
TheShieldsWebSocket = MainApplication()
server =tornado.httpserver.HTTPServer(TheShieldsWebSocket,max_body_size=128)
server.listen(8080)

【问题讨论】:

【参考方案1】:

从 4.5 版开始,如果 Tornado 在单个 websocket 帧(消息)中接收到超过 10 MiB 的数据,它将自动关闭连接。因此,您不必担心有人会在一条消息中发送大量数据。您可以在source code 中看到这一点。在倒数第二段WebsocketHandler 的文档中也提到了这一点。

如果您想更改默认帧限制,您可以向您的 Application 类传递一个名为 websocket_max_message_size 的参数,其大小以字节为单位。

app = tornado.web.Application(
      # your handlers etc,
      websocket_max_message_size=128
)

【讨论】:

【参考方案2】:

在此处查看文档:

http://www.tornadoweb.org/en/stable/http1connection.html#tornado.http1connection.HTTP1Connection.set_max_body_size

为了将来对链接的校对进行解释:

set_max_body_size(max_body_size)[来源]

为单个请求设置正文大小限制。

覆盖来自 HTTP1ConnectionParameters 的值。

【讨论】:

我刚刚编辑了我的帖子。你能放一个接收有限消息长度的示例 websocket 服务器代码吗?

以上是关于如何限制龙卷风 websocket 消息大小的主要内容,如果未能解决你的问题,请参考以下文章

akka websocket 消息大小限制

龙卷风 websocket 服务器 - 连接队列

我如何在我的 websocket 龙卷风中获得动态网址?

如何从本地机器公开龙卷风 websocket

如何响应龙卷风websocket中的服务器ping

Tornado websockets:在进程之间共享打开的 web sockets