新的 WebSocket 协议的不同之处

Eiji Kitamura
北村英二

为了解决之前的安全问题,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 的源密钥,以防止从服务提供商不知道的脚本进行访问。请注意,在 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。