【问题标题】:tornado 403 GET warning when opening websocket打开 websocket 时龙卷风 403 GET 警告
【发布时间】:2014-09-11 03:19:24
【问题描述】:

我发现这个 python 脚本应该允许我打开一个 WebSocket。 但是,当我尝试打开实际的 WebSocket(使用旧 WebSocket 终端 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()

【问题讨论】:

  • 我正在使用 Tornado 版本 4.0 tornadoweb.org/en/stable
  • 你是否试图打开网络套接字连接?
  • 谢谢 Ben,看来那里确实讨论了同样的问题。一定忽略了,抱歉重复发帖。我现在安装了 tornado 版本 2.4.1,它就像一个魅力。现在我解决了这个问题并继续前进。
  • Gas,我使用了 chrome 扩展 Simple WebSocket。在这里找到它:link。目前我正在编写一个 html 脚本来处理这个问题。

标签: python websocket tornado


【解决方案1】:

请补充

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

来自文档:

默认情况下,[check_origin] 拒绝所有来源在主机上的请求,而不是 这个。

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

再说一遍:

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

Link.

【讨论】:

  • 文档几乎没有提到它 - 非常感谢您节省了我剩下的头发。
【解决方案2】:

稍微修改了@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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多