为了解决之前的安全问题,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 的源密钥,以防止从服务提供商不知道的脚本进行访问。请注意,在 HyBi 11 中,这只是“Origin
”。
JS API 变更
subprotocol
现在可以是数组,从而允许new WebSocket(String url, Array subprotocol)
的方法签名.protocol
属性 [字符串].binaryType
属性 [Blob|ArrayBuffer].extension
[字符串]- 向
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。