Workerman4WebSocket 协议校验,非法 websocket 握手直接拒绝连接

轻伟小哥_6911

轻伟小哥_6911

2026-10-04

954人浏览

原创

workerman 默认不自动拒绝非法websocket握手,需在onconnect中手动校验upgrade、connection、sec-websocket-key、origin、host等头字段并主动close;禁用错误输出以防响应污染导致隐式失败。

workerman4websocket 协议校验,非法 websocket 握手直接拒绝连接

Workerman 默认对 WebSocket 握手有基础协议校验,但不会自动拒绝所有非法握手——它依赖你显式配置和主动拦截。若想在握手阶段就拦截不合规请求(比如缺少 Upgrade 头、Sec-WebSocket-Key 格式错误、非 websocket 协议升级等),需手动介入 onConnect 回调或使用中间件逻辑,在 HTTP 请求解析完成但连接尚未升级前做判断。

关键校验点必须手动实现

Workerman 的 Worker 启动为 websocket:// 时,会自动处理 RFC 6455 握手流程,包括生成 Sec-WebSocket-Accept,但它不会主动拒绝以下常见非法情况:

  • 请求头中 Upgrade 值不是小写 websocket(如 WebSocket、WEBSOCKET 或缺失)
  • Connection 头不含 Upgrade(大小写敏感,不能是 upgrade 或 keep-alive, upgrade 以外的组合)
  • Sec-WebSocket-Key 为空、长度不对(必须是 24 字节 Base64 编码)、含非法字符
  • 请求方法不是 GET,或 URI 不符合预期(如要求固定路径 /ws,但客户端访问了 /api)

如何在握手前拦截并拒绝

Workerman 并未暴露“握手前钩子”,但可通过以下方式在连接建立初期精准干预:

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载
  • 在 onConnect 回调中,用 $connection->getRemoteIp() 和 $connection->context->request(需开启 http 解析)获取原始请求对象
  • 若使用 WebServer + Worker 混合模式,可在 onMessage 前检查 $connection->isWebsocketConnection === false,说明握手未成功,此时可 $connection->close()
  • 更可靠的做法:改用 HttpServer 监听,自己解析请求头,对非法握手直接返回 400 Bad Request 并关闭连接,不交由 WebSocket 层处理
  • 示例片段(在 onConnect 中):
    if (!$connection->isWebsocketConnection) {
        $connection->close();
        return;
    }
    // 继续校验 Sec-WebSocket-Key 等字段
    $key = $connection->context->request->header['sec-websocket-key'] ?? '';
    if (empty($key) || strlen(base64_decode($key, true)) !== 16) {
        $connection->close();
        return;
    }

    Origin 和 Host 校验也得自己加

    Workerman 不做跨域 Origin 校验,默认放行所有来源。若需拒绝非法来源的握手请求:

    • 读取 $connection->context->request->header['origin']
    • 比对白名单域名(注意:空 Origin 或 file:// 场景也要考虑)
    • 不匹配时调用 $connection->close(),不要等进入 onMessage
    • Host 头校验同理,尤其在 Nginx 反代后,$host 可能被覆盖,需结合 X-Forwarded-Host 判断

    避免响应体污染导致隐式失败

    即使你写了 return 或 exit,只要在握手响应已发送后还输出任何内容(如 warning、BOM、echo),浏览器就会判定握手失败,且不报错。务必做到:

    • 所有校验逻辑放在 onConnect 尽早位置
    • 禁用 PHP 错误显示:ini_set('display_errors', 'Off')
    • 确保没有意外的 var_dump、print_r 或日志写入到标准输出
    • 用抓包工具(如 Wireshark 或浏览器 Network 面板)确认是否真返回了 101 Switching Protocols

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

2025.12.22

175

11

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

2026.01.19

396

22

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

2026.03.18

655

14

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

2026.05.25

408

33

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

2026.05.25

301

20

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

166

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

202

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

187

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习