web-dev-qa-db-fra.com

tornado 403 GET warning lors de l'ouverture de websocket

J'ai trouvé ce script python qui devrait me permettre d'ouvrir WebSocket . Cependant, je reçois l'avertissement [W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms sur mon terminal Linux lorsque j'essaie d'ouvrir le WebSocket lui-même (à l'aide du plugin Old WebSocket Terminal Chrome). Les messages "connexion ouverte", "connexion fermée" et "message reçu" ne sont jamais imprimés dans la fenêtre du terminal. 

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

s'il-vous-plait ajoutez

def check_Origin(self, Origin):
    return True

dans la classe MyHandler comme ça

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

Des DOC:

Par défaut, [check_Origin] rejette toutes les demandes ayant une origine sur un hôte autre que celui-là.

C'est une protection de sécurité contre les attaques de script entre sites sur les navigateurs, puisque les WebSockets sont autorisés à contourner l’habituel origine-même politiques et ne pas utiliser les en-têtes CORS.

Et encore:

Ceci est une mesure de sécurité importante; ne le désactivez pas sans comprendre les implications pour la sécurité. En particulier, si votre L’authentification est basée sur les cookies, vous devez soit limiter les origines autorisé par check_Origin () ou implémentez votre propre protection, semblable à XSRF pour les connexions websocket. Voir ces articles pour plus.

Lien .

92
maxhawkdown

Solution légèrement modifiée de @ 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
0
guneysus