Websocket為什麼在客戶端向服務端發送報文的時候需要掩碼加密,而服務端向客戶端不需要呢?

本人大四,學習websocket協議的時候看到了數據幀進行掩碼加密傳輸的部分,
看到 :
為了安全考慮,客戶端需要對發送的數據幀進行掩碼處理(比如中間攔截破壞),伺服器一旦收到無掩碼幀,連接將關閉;而伺服器發送到客戶端的數據幀無需做掩碼處理;
想請問下兩個問題,1.為何這個加密是單向,為了的是什麼安全考慮呢,加解密的值和演算法都是可知的,被攔截了同樣可以解析出來報文內容;
2.為什麼不要雙向都做掩碼處理呢;


Websocket的協議也修改過很多版本,現在用的都是第13版。

這個協議的具體RFC的這個小結有專門關於安全的慮:https://tools.ietf.org/html/rfc6455#section-10

這篇論文: http://w2spconf.com/2011/papers/websocket.pdf 提到了之前版本(也就是沒有mask的版本)的安全漏洞,並提出了請求報必須每幀分別打碼的要求。原因是因為有一些代理會以為websocket是個普通的http請求,在對請求數據轉發的時候會解釋請求。如果發現類似HTTP 請求頭的時候就會轉發相應的請求到伺服器,如果請求數據是故意偽造的,那麼有些代理就會向目標地址發起請求。這個可以用來攻擊目標服務或者故意污染代理服務,導致其他用戶會訪問偽造的數據而被攻擊。

而對於響應的數據代理伺服器只管轉發或者根據響應頭裡的緩存信息來決定是否緩存。

如果想詳細了解,建議完整的讀完前面提到的論文。

從RFC協議看設計的初衷是針對瀏覽器的,從HTML5里的API也可以看出來:

var connection = new WebSocket("ws://html5rocks.websocket.org/echo", ["soap", "xmpp"]);

API只允許兩個參數:地址和支持的自協議subprotocol。我們在瀏覽器里都不能設置其他的頭。

其實很多時候我們可以寫腳本來達到攻擊的目的,RFC里也提到對於這類的客戶端只能服務端擦亮眼睛,做好防範。因為瀏覽器的特點不一樣,是使用最廣的客戶端,所以危害也是最大的。對於使用自定義的客戶端就要在其他地方做好防範措施了。


不是加密用 是防網頁上的惡意腳本
因為如果能讓websocket完全控制socket里的內容 就約等於給了腳本tcp socket的許可權 它就可以用ws去攻擊一些實現得不好的http代理或伺服器
隨機加一個掩碼 讓瀏覽器知道掩碼而腳本不知道 一定程度上避免了這類攻擊


推薦閱讀:

SVG 具體的應用場景是怎樣的?為什麼代替 Flash 的是 Canvas 而不是 SVG 呢?
如何評價浙江大學三名教授及一名研究生申請利用 defineProperty 做數據雙向綁定的專利?
餓了么H5站那個佔位的base64圖片是如何生成的啊?
WebStorm 有哪些過人之處?
求一份前端開發命名規範文檔?

TAG:前端開發 | Nodejs | 計算機網路 | TCP | 網路協議 |