python-打开网站时龙卷风403获取警告
我找到了这个Python脚本,应该可以打开WebSocket。但是,尝试打开实际的WebSocket(使用Old 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个解决方案
98 votes
请加
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]拒绝源于主机以外的主机的所有请求 这个。
这是针对跨站点脚本攻击的安全保护 浏览器,因为允许WebSocket绕过通常的相同来源 政策,并且不要使用CORS标头。
然后再次:
这是一项重要的安全措施。 没有它就不要禁用它 了解安全隐患。 特别是如果您 身份验证是基于Cookie的,您必须限制来源 由check_origin()允许或实施您自己的类似XSRF的保护 用于websocket连接。 有关更多信息,请参见这些文章。
链接。
maxhawkdown answered 2020-07-18T00:16:09Z
1 votes
略微修改了@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
guneysus answered 2020-07-18T00:16:29Z
1 votes
不要将return True设置在check_origin()上,因为这是一种安全威胁,请改用允许的域列表,即:
def check_origin(self, origin):
allowed = ["https://site1.tld", "https://site2.tld"]
if origin in allowed:
print("allowed", origin)
return 1
Pedro Lobito answered 2020-07-18T00:16:49Z