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 10?
- Chrome 14 支援 HyBi 10 通訊協定,但上述的 WebSocket JavaScript API 異動仍在進行中。此外,Firefox 7 也預計支援 HyBi 10。