【问题标题】:how to limit tornado websocket message size如何限制龙卷风 websocket 消息大小
【发布时间】: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)

【问题讨论】:

    标签: python websocket tornado


    【解决方案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 服务器代码吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多