Skip to content

修复: WebSocket Origin 校验拒绝同源请求导致新会话无法发消息#557

Open
SinlinLi wants to merge 1 commit into
riba2534:mainfrom
SinlinLi:fix/ws-origin-same-origin
Open

修复: WebSocket Origin 校验拒绝同源请求导致新会话无法发消息#557
SinlinLi wants to merge 1 commit into
riba2534:mainfrom
SinlinLi:fix/ws-origin-same-origin

Conversation

@SinlinLi
Copy link
Copy Markdown
Contributor

@SinlinLi SinlinLi commented Jun 6, 2026

问题描述

ed775b8 新增的 CSWSH 防护对 WebSocket 升级请求做了 Origin 白名单校验,但 isAllowedOrigin() 只放行 localhost 和 CORS_ALLOWED_ORIGINS 白名单,未处理同源请求。

通过域名或非 localhost IP 访问时,浏览器发出的 Origin header 不匹配任何白名单条目,WebSocket 连接被 403 Forbidden 拒绝。

症状:创建新会话发消息时提示 "WebSocket 未连接,输入已保留,请稍后重试",主会话不受影响。

原因:主会话走 HTTP POST /api/messages(同源请求不需要 CORS),新会话/Agent 对话走 WebSocket send_message,WS 连接被 Origin 校验挡掉。

修复方案

src/web.ts

在 Origin 白名单校验前增加同源检查:比较 Origin header 的 host 与 HTTP Host header,匹配则视为同源请求直接放行,不再走白名单校验。

Origin: https://example.com:3000
Host: example.com:3000
→ 同源,放行

跨站请求(Origin ≠ Host)仍走原有的 isAllowedOrigin() 白名单逻辑,CSWSH 防护不受影响。

🤖 Generated with Claude Code

ed775b8 新增的 CSWSH 防护对 WebSocket 升级请求做了 Origin 白名单校验,
但 isAllowedOrigin() 只放行 localhost 和 CORS_ALLOWED_ORIGINS 白名单,
未处理同源请求。通过域名或非 localhost IP 访问时,浏览器发出的 Origin
header 不匹配任何白名单条目,WebSocket 连接被 403 拒绝。

主会话不受影响(走 HTTP POST /api/messages),但新会话/Agent 对话
走 WebSocket send_message,连接断开导致 "WebSocket 未连接" 报错。

修复:在白名单校验前增加同源检查——如果 Origin 的 host 与 HTTP
Host header 一致,视为同源请求直接放行。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@SinlinLi SinlinLi force-pushed the fix/ws-origin-same-origin branch from 0786b30 to 9ad6997 Compare June 6, 2026 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant