新版 WebSocket 通訊協定的差異

Eiji Kitamura
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。這麼做可防範跨通訊協定攻擊。
  • 現在每個影格都必須設定影格遮罩。以免 Proxy 中毒。已新增 Sec-WebSocket-Origin,以防止服務供應商未知的指令碼存取。
  • 系統會新增 Sec-WebSocket-Origin 來取代 HyBi 00 的 Origin 鍵,防止服務供應商不知道的指令碼存取。請注意,這在 HyBi 11 中只會是「Origin」。

JS API 異動

  • subprotocol 現在可以是陣列,允許 new WebSocket(String url, Array subprotocol) 的方法簽章
  • .protocol 屬性 [字串]
  • .binaryType 屬性 [Blob|ArrayBuffer]
  • .extension [字串]
  • 狀態碼和原因 (連線關閉的原因) 已新增至 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 00 已知有安全漏洞。

哪個瀏覽器支援 HyBi 10?

  • Chrome 14 支援 HyBi 10 通訊協定,不過上述 WebSocket JavaScript API 變更仍在開發中。Firefox 7 也計劃支援 HyBi 10。