2017-11-22 18 views
2

私は竜巻にwebsocketサーバーを書いており、メッセージを受け取ったときにon_messageメソッドが呼び出されます。問題は、メッセージのサイズは基本的に無制限であるということです。言い換えれば、このプロジェクトは、クライアントからWebSocketに大量のデータ(Message)を送信することによって攻撃を開始し、サーバー側のメモリをいっぱいにします。着信メッセージサイズに制限を設けるオプションが必要ですか?そうでない場合、私はそのようなバグを避けるために何をしなければならないのですか?

ここで私のコードは128バイト未満の長さのメッセージを取得するコードですが、動作しないようです。竜巻を制限する方法websocketメッセージサイズ

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) 

答えて

0

1つのwebsocketフレーム(メッセージ)で10 MiB以上のデータを受信すると、バージョン4.5以来、Tornadoは自動的に接続を終了します。だから、誰かが巨大なデータを1つのメッセージで送ることを心配する必要はありません。これはsource codeで確認できます。 2番目の最後の段落のWebsocketHandlerのドキュメントにも記載されています。

デフォルトのフレーム制限を変更したい場合は、Applicationクラスに、サイズがバイトのwebsocket_max_message_sizeという引数を渡すことができます。

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

動作します、ありがとうございます –

0

ここにドキュメントを見てみましょう:

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

をリンク校正将来のために言い換えするには:

set_max_body_size(max_body_size)[ソース]

1回のリクエストに対するボディサイズの制限を設定します。

HTTP1ConnectionParametersの値を上書きします。

+0

私は自分の投稿を編集しました。限られたメッセージ長を受け取るwebsocketサーバーコードのサンプルを入れてください。 –

関連する問題