web-dev-qa-db-ja.com

竜巻403 Websocketを開くときに警告を取得

私はこれを見つけましたpython WebSocketを開くことを許可するスクリプト。しかし、実際のWebSocketを開こうとすると、Linuxターミナルで警告[W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 msを受け取ります(古いWebSocketターミナルChromeプラグイン)。「接続が開かれました」、「接続が閉じられました」、および「メッセージを受信しました」というメッセージは、ターミナルウィンドウに表示されません。

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket

class MyHandler(tornado.websocket.WebSocketHandler):
        def open(self):
                print "connection opened"
                self.write_message("connection opened")

        def on_close(self):
                print "connection closed"

        def on_message(self,message):
                print "Message received: {}".format(message)
                self.write_message("message received")

if __== "__main__":
        tornado.options.parse_command_line()
        app = tornado.web.Application(handlers=[(r"/",MyHandler)])
        server = tornado.httpserver.HTTPServer(app)
        server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
43
Dorus

追加してください

def check_Origin(self, Origin):
    return True

このようなクラスMyHandlerで

class MyHandler(tornado.websocket.WebSocketHandler):

    def check_Origin(self, Origin):
        return True

    def open(self):
        print "connection opened"
        self.write_message("connection opened")

    def on_close(self):
        print "connection closed"

    def on_message(self,message):
        print "Message received: {}".format(message)
        self.write_message("message received")

DOCから:

デフォルトでは、[check_Origin]は、このホスト以外のホスト上のオリジンを持つすべてのリクエストを拒否します。

これは、WebSocketが通常の同一生成ポリシーをバイパスし、CORSヘッダーを使用しないため、ブラウザーでのクロスサイトスクリプティング攻撃に対するセキュリティ保護です。

そしてまた:

これは重要なセキュリティ対策です。セキュリティへの影響を理解せずに無効にしないでください。特に、認証がCookieベースである場合、check_Origin()で許可されるオリジンを制限するか、WebSocket接続に対して独自のXSRFのような保護を実装する必要があります。詳細については これらの記事 を参照してください。

リンク

96
maxhawkdown

しないでくださいcheck_Origin()に_return True_を設定するのは セキュリティの脅威 であるため、使用代わりにallowedドメインのリスト、つまり:

_def check_Origin(self, Origin):
    allowed = ["https://site1.tld", "https://site2.tld"]
    if Origin in allowed:
        print("allowed", Origin)
        return 1
_
1
Pedro Lobito

@maxhawkdownのソリューションを少し変更しました。

from tornado.util import PY3

if PY3:
    from urllib.parse import urlparse  # py2

    xrange = range
else:
    from urlparse import urlparse  # py3


class ChatHandler(tornado.websocket.WebSocketHandler):
    CORS_ORIGINS = ['localhost']

    def check_Origin(self, Origin):
        parsed_Origin = urlparse(Origin)
        # parsed_Origin.netloc.lower() gives localhost:3333
        return parsed_Origin.hostname in self.CORS_ORIGINS
1
guneysus