私はこれを見つけました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()
追加してください
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のような保護を実装する必要があります。詳細については これらの記事 を参照してください。
リンク 。
しないでください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
_
@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