WebSocket 是現今網站常使用的通訊協定,通常用來於使用者須及時操作的場景,如聊天室,首先執行 WebSocket 的必須先透過 HTTP 進行連線。
範例
var ws = new WebSocket("wss://feifei.com.tw/chat");
GET /chat HTTP/1.1
Host: feifei.com.tw
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
Upgrade: websocket
Origin: https://feifei.com.tw
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-TW,zh;q=0.9,en;q=0.8,zh-CN;q=0.7
Sec-WebSocket-Key: 0ReW1LEX1c2qand9Jqj9vg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
HTTP/1.1 101 Switching Protocol
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: q66Hj1y4IMh+m9EkQRdX87EBrWc=
Sec-WebSocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover
Content-Length: 0
Connection
和 Upgrade
headers 為 websocket
Sec-WebSocket-Version
指定希望使用的 WebSocket 版本,通常是版本 13。Sec-WebSocket-Key
為 Base64 編碼的隨機值,在每個 handshake 請求中隨機產生。Sec-WebSocket-Accept
為請求 Sec-WebSocket-Key
的 hash 值,且於規範定義的特定的字串串接,為了防止由於伺服器設定錯誤或 proxy caching 錯誤而引起的 misleading responses。ws.send("Hello World!");
ws.onmessage = function(e) {
console.log(e.data);
}
進行檢測
LAB
加強版的 CSRF - cross-site WebSocket hijacking (CSWSH)