防范cswsh攻击需严格校验origin头、绑定用户会话、启用子协议校验、限制连接生命周期及权限粒度。服务端须在upgrade阶段验证origin白名单,拒绝空值或非https来源;必须通过httponly cookie或sec-websocket-protocol头验证身份,禁用url传token;子协议需前后端严格匹配;连接应设超时与最小权限控制。

WebSocket 本身不遵守同源策略,但浏览器在发起连接时会带上 Origin 头——这正是防范跨站 WebSocket 劫持(CSWSH)的第一道也是最关键的防线。光靠 Cookie 认证远远不够,攻击者完全可以在自己的页面里触发合法用户的 WebSocket 握手,从而双向窃取或操纵数据。
严格校验 Origin 请求头
服务端必须在 HTTP Upgrade 阶段检查 Origin 是否属于预设白名单,不能忽略、不能通配、不能只信 Referer。
- 只允许明确列出的前端域名,例如
https://app.example.com、https://admin.example.com - 拒绝空
Origin或非 HTTPS 的Origin(开发环境可临时放宽,生产环境必须强制 HTTPS) - Node.js 中使用
ws库时,应在server.on('upgrade')中拦截并比对,不匹配立即socket.destroy()
绑定用户会话,避免仅依赖 Cookie
Origin 校验只能防“谁连你”,不能防“谁在连”。必须确保这个 WebSocket 连接背后是当前已登录且有效的用户。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 握手请求需携带 HttpOnly 的 session cookie,服务端验证 session 是否存在、未过期、未被注销
- 禁止把 token 拼在 URL 里(如
ws://?token=xxx),否则可能泄露到日志、代理或 Referer - 连接建立后,立刻要求客户端发送一次认证帧(如
{"type":"auth","token":"..."}),服务端验证通过才开放业务通道
启用并校验子协议(Sec-WebSocket-Protocol)
这不是银弹,但能有效过滤掉大量非正规客户端(比如用 curl 或 Python 脚本直连的攻击尝试)。
- 前端创建时指定:
new WebSocket('wss://api.example.com/ws', ['myapp-v1']) - 服务端检查请求头中是否包含且仅包含受信协议名,例如
myapp-v1,不匹配则中断连接 - 配合 Origin 和身份校验,形成多层识别机制
限制连接生命周期与操作权限
即使连接通过了所有校验,也不应赋予无限权限或放任长期空闲。
- 设置合理的连接超时时间(如 5 分钟无心跳则断开)
- 按角色或场景分配最小必要权限,例如普通用户 WebSocket 只能收消息,不能发敏感指令
- 对高频、高危操作(如密码重置、资金转账)额外要求二次验证或时效 token
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










