龙卷风403打开websocket时发出警告

我发现这个python脚本应该让我打开一个WebSocket。 然而,当我尝试打开实际的WebSocket(使用Old WebSocket Terminal Chrome插件)时,我收到警告[W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms 。 terminal窗口不会打印“连接打开”,“连接closures”和“收到消息”消息。

 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 __name__ == "__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 ]拒绝所有在除此之外的主机上有源的请求。

这是针对浏览器上的跨站点脚本攻击的安全保护,因为WebSockets被允许绕过通常的同源策略而不使用CORS头。

然后再次:

这是一个重要的安全措施; 不要在不理解安全含义的情况下禁用它。 特别是,如果您的身份validation是基于cookie的,那么您必须限制check_origin()所允许的来源,或者为websocket连接实施您自己的类似XSRF的保护。 看到这些文章更多。

链接 。

稍微修改@ maxhawkdown的解决scheme。

 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