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。這麼做可防範跨通訊協定攻擊。 - 現在每個影格都必須設定影格遮罩。以免 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
[字串]- 狀態碼和原因 (連線關閉的原因) 已新增至
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 00 已知有安全漏洞。
哪個瀏覽器支援 HyBi 10?
- Chrome 14 支援 HyBi 10 通訊協定,不過上述 WebSocket JavaScript API 變更仍在開發中。Firefox 7 也計劃支援 HyBi 10。