Подтвердить что ты не робот

Tornado 403 Предупреждение GET при открытии websocket

Я нашел этот python script, который должен позволить мне открыть WebSocket. Тем не менее, я получаю предупреждение [W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms в моем Linux-терминале при попытке открыть фактический WebSocket (с помощью плагина Old WebSocket Terminal 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 __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()
4b9b3361

Ответ 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")

Из DOC:

По умолчанию [check_origin] отклоняет все запросы с источником на хосте, отличном от этот.

Это защита для защиты от межсайтовых скриптовых атак на браузеров, поскольку WebSockets разрешено обходить обычное одноименное происхождение политики и не использовать заголовки CORS.

И снова:

Это важная мера безопасности; не отключать его без понимая последствия для безопасности. В частности, если аутентификация основана на файлах cookie, вы должны либо ограничить исход разрешено check_origin() или реализует вашу собственную XSRF-подобную защиту для сетевых соединений. Подробнее см. эти статьи.

Ссылка.

Ответ 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