新的 WebSocket 协议的不同之处

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-KeySec-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]
  • 状态代码和原因(关闭连接的原因)已添加到 CloseEventclose() 函数也相应地更改为接受这两个参数。

扩展程序

  • 添加了 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。