如何限制龙卷风 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 消息大小的主要内容,如果未能解决你的问题,请参考以下文章