龙卷风403打开websocket时GET警告

时间:2014-07-20 13:58:08

标签: python websocket tornado

我发现这个python脚本应该允许我打开一个WebSocket。 但是,当我尝试打开实际的WebSocket(使用旧的WebSocket Terminal Chrome插件)时,我在Linux终端中收到警告[W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms。永远不会在终端窗口中打印消息“连接已打开”,“连接已关闭”和“已接收消息”。

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()

3 个答案:

答案 0 :(得分:93)

请添加

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头。

再次:

  

这是一项重要的安全措施;不要禁用它   了解安全隐患。特别是,如果你的   身份验证是基于cookie的,您必须限制起源   由check_origin()允许或实现您自己的类似XSRF的保护   用于websocket连接。有关详情,请参阅these articles

Link

答案 1 :(得分: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

答案 2 :(得分:1)

不要只是在return True上设置check_origin(),因为它是security threat,而是使用允许域的列表,即:

def check_origin(self, origin):
    allowed = ["https://site1.tld", "https://site2.tld"]
    if origin in allowed:
        print("allowed", origin)
        return 1