2014-10-28 25 views
0

當我關閉瀏覽器窗口,我得到這個接近包(其中Wireshark的和libwebockets理解)socket.close()發送惡意數據包

WebSocket 
1... .... = Fin: True 
.000 .... = Reserved: 0x00 
.... 1000 = Opcode: Connection Close (8) 
0... .... = Mask: False 
.000 0010 = Payload length: 2 
Payload 
    Close: 03e9 
    Close: Going Away (1001) 

當我使用socket.close();(Windows下的最新版本的Chrome)我得到的這個包既不wirehark也不libwebockets理解。

WebSocket 
1... .... = Fin: True 
.000 .... = Reserved: 0x00 
.... 1000 = Opcode: Connection Close (8) 
1... .... = Mask: True 
.000 0000 = Payload length: 0 
Masking-Key: 1e45aadf 
Payload 
    Close: <MISSING> 
Unmask Payload 
[Dissector bug, protocol WebSocket: tvbuff.c:690: failed assertion "DISSECTOR_ASSERT_NOT_REACHED"] 

回答

2

從技術上講,其實並沒有什麼錯。

https://tools.ietf.org/html/rfc6455#section-5.5.1

關閉幀可以包含一個主體(「應用程序數據」的幀的一部分 ),指示用於閉合,諸如 端點關停原因,具有一個端點接收到一個太大的幀,或者端點收到了一個幀,該幀不符合端點預期的格式。 。 如果有主體,主體的前兩個字節必須是一個2字節的無符號整數(以 網絡字節順序),表示一個狀態碼,其值爲/ code/ 在7.4節中定義。繼2字節整數後...

因此谷歌瀏覽器正在發送一個不包含原因的合理框架,並且這是合法的。 MAY indicates an optional feature

所以它不是畸形的,它只是奇怪。這很奇怪,因爲它是一個沒有有效載荷的掩碼幀,它可以設置掩碼位,並保存掩碼鍵的4個字節。也很奇怪,因爲它在做socket.close()時包含了一個關閉原因,但是在關閉瀏覽器時它沒有,儘管它是合法的。

我覺得這只是谷歌瀏覽器的行爲不一致,不過,應該正確libwebsockets和Wireshark處理,因爲它符合規範。

1

儘管socket.close();調用是完全有效的,但您可能需要嘗試socket.close(1000, "Goodbye from client");以防止Wireshark中出現令人討厭的消息。