2013-05-15 70 views
4

要打開WebSocket,客戶端連接到服務器上的tcp套接字,然後開始握手。爲什麼WebSockets在握手中使用散列?

客戶端的握手包含一個base64編碼密鑰(Sec-WebScoket-Key)。

服務器應該用SHA-1(key + magic_constant),base64編碼進行響應。 magic_constant是協議特定的字符串(Sec-Websocket-Accept)。

這是什麼目的?我沒有看到這樣做的任何明顯的安全原因。它不認證任何一方。單一的SHA-1計算對於工作證明來說並不算多。

回答

3

這部分握手的目的是確保連接的兩端都是真正的WebSocket參與者。它被設計爲易於爲真正的WebSocket客戶端和服務器實現,但攻擊者很難欺騙HTTP客戶端,服務器或代理假裝成WebSocket參與者。尤其是,如果在瀏覽器中運行的惡意JavaScript可能會打開與普通HTTP服務器的WebSocket連接,這將是一件壞事,因爲一旦建立了連接,JavaScript就可以完全控制通過通道發送的內容,並且可以嘗試各種畸形的超大數據試圖破壞或取下服務器。

更新

由於@notallama所指出的,可以很容易地創建一個惡意的WebSocket客戶端或者只是使用telnet來發送惡意數據。不同之處在於,對於WebSocket,攻擊來自可信上下文(用戶的瀏覽器和用戶網絡)。瀏覽器從Internet加載不受信任的代碼,但通常用於連接到不暴露於Internet的HTTP服務器和中介。作爲一個極端的例子,想象一下,如果不是WebSockets,瀏覽器可以打開原始的TCP連接(沒有強制的CORS,哈希檢查等)。現在,惡意的JavaScript可以在用戶家庭網絡(或者更糟糕的是,他們的工作場所內部網)上做任何事情。

特別是,HyBi工作組花費了大量的時間來解決HTTP中間層的理論漏洞,這種漏洞會通過使用WebSocket連接欺騙中間人認爲他們正在與普通的HTTP客戶端通話,從而導致緩存污染。

+0

攻擊者不能輕易地通過telnet連接到HTTP服務器併發送錯誤數據?我並沒有真正看到這種握手如何阻止問題,甚至使問題變得更加困難。 – notallama

相關問題