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


问题内容

我已经在龙卷风中编写了一个websocket服务器,并且on_message在收到消息时调用了方法。问题是,消息的大小不受defualt的限制,也就是说,通过从客户端向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)

问题答案:

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

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

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