WebSocket 协议规范最近已更新,以解决之前的安全问题,并且在很大程度上是稳定的。下面总结了相关变更,并提供了一些关于当前实现的说明。
自 WebSocket HyBi 00 以来发生了哪些变化?
- 协议帧格式已更改。HyBi 00 以前会为每个帧使用
"0x00"
作为头部,使用"0xff"
作为尾部。HyBi 10 现在使用以下新格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/63) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
安全问题已得到解决
- 添加了
Sec-WebSocket-Key
和Sec-WebSocket-Accept
,以替换 HyBi 00 的三个键。浏览器将随机生成的数字提供给Sec-WebSocket-Key
。然后,服务器将其与 WebSocket 协议的特定 GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11
) 和 SHA1 / BASE64 等一起使用,以返回Sec-WebSocket-Accept
,以便浏览器确认它了解 WebSocket。这可以防止跨协议攻击。 - 对于每一帧,现在都需要进行帧遮盖。这可以防止代理上的缓存中毒。添加了
Sec-WebSocket-Origin
,以防止服务提供商不知情的脚本访问。 - 添加了
Sec-WebSocket-Origin
来替换 HyBi 00 的 Origin 键,以防止服务提供商不知道的脚本访问。请注意,在 HyBi 11 上,此值将仅为“Origin
”。
JS API 变更
subprotocol
现在可以是数组,允许使用new WebSocket(String url, Array subprotocol)
方法签名.protocol
属性 [String].binaryType
属性 [Blob|ArrayBuffer].extension
[String]- 状态代码和原因(关闭连接的原因)已添加到
CloseEvent
。close()
函数也相应地更改为接受这两个参数。
扩展程序
- 添加了
Sec-WebSocket-Extensions
。建议的延期期限如下: deflate-frame
会在源端压缩帧,并在目标端提取帧。x-google-mux
支持多路复用,但处于早期阶段。
HyBi 00 和 HyBi 10 在服务器和浏览器实现方面是否兼容?
- 服务器实现可以通过查看握手 HTTP 标头来同时支持 HyBi 00 和 HyBi 10。但是,由于 HyBi 00 已知存在漏洞,因此不建议支持它。
- 旧版和新版 WebSocket JavaScript API 在很大程度上是类似的。不过,如上所述,我们不建议支持 HyBi 00,因为它已知存在漏洞。
哪些浏览器支持 HyBi 10?
- Chrome 14 支持 HyBi 10 协议,但上述 WebSocket JavaScript API 更改仍在进行中。Firefox 7 也计划支持 HyBi 10。