fix(socket): CORS 放行改为根域后缀校验,修复子域握手被拒
- engineio 不支持 'https://*.gvsds.com' 通配串,改为可调用对象 AllowOrigin - 按根域(gvsds.com 等)与本地主机放行,实测 gerp/www/api/localhost 通过
This commit is contained in:
1 parent
cd789dd2dd
commit
4b074e565a
1 file changed
+32
-10
+32
-10
@@ -38,22 +38,44 @@
|
|||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
import traceback
|
import traceback
|
||||||
|
import urllib.parse
|
||||||
import socketio
|
import socketio
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
NS = '/msync'
|
NS = '/msync'
|
||||||
|
|
||||||
sio = socketio.Server(async_mode='gevent', cors_allowed_origins=[
|
#: 允许的前端来源根域(含其全部子域)——浏览器 WebSocket 握手会带 Origin,必须显式放行
|
||||||
'https://*.gvsds.com',
|
ALLOWED_ORIGIN_ROOTS = (
|
||||||
'https://*.gvsds.dev',
|
'gvsds.com', 'gvsds.dev', 'gvsds.org', 'gvsds.studio', 'yc8z.org', 'ycbz.org',
|
||||||
'https://*.yc8z.org',
|
)
|
||||||
'https://*.ycbz.org',
|
#: 本地开发来源主机(任意端口)
|
||||||
'https://*.gvsds.org',
|
ALLOWED_ORIGIN_HOSTS = ('localhost', '127.0.0.1')
|
||||||
'https://*.gvsds.studio',
|
|
||||||
'http://localhost:*',
|
|
||||||
'http://127.0.0.1:*',
|
def AllowOrigin(origin, environ=None):
|
||||||
], logger=True, engineio_logger=True)
|
"""CORS Origin 校验(供 engineio 以可调用对象方式调用)
|
||||||
|
|
||||||
|
背景:engineio 的 cors_allowed_origins 只支持「精确字符串 / '*' / 可调用对象」,
|
||||||
|
不支持 'https://*.gvsds.com' 这类通配写法——那样写会被当成字面量,
|
||||||
|
浏览器端(如 https://gerp.gvsds.com)握手会被判为 "not an accepted origin"。
|
||||||
|
这里按根域后缀统一放行,涵盖 gerp/www/api/viper 等全部子域。
|
||||||
|
"""
|
||||||
|
if not origin:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
host = (urllib.parse.urlsplit(origin).hostname or '').lower()
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
if not host:
|
||||||
|
return False
|
||||||
|
if host in ALLOWED_ORIGIN_HOSTS:
|
||||||
|
return True
|
||||||
|
return any(host == root or host.endswith('.' + root) for root in ALLOWED_ORIGIN_ROOTS)
|
||||||
|
|
||||||
|
|
||||||
|
sio = socketio.Server(async_mode='gevent', cors_allowed_origins=AllowOrigin,
|
||||||
|
logger=True, engineio_logger=True)
|
||||||
|
|
||||||
_sid_service_map = {}
|
_sid_service_map = {}
|
||||||
_service_sid_map = {}
|
_service_sid_map = {}
|
||||||
|
|||||||
Reference in new issue
Block a user