WebSocket 安全性有很多不同的方面。
您引用的维基百科的摘录是指 WebSocket 客户端对服务器数据的屏蔽。这是为了保护行为不端的中介(例如代理和缓存)不会意外地将 WebSocket 流量解释为正常的 HTTP 流量。这里的危险是 WebSockets 协议可能被用来毒化缓存中介。然而,我应该指出,这纯粹是理论上的问题,但 Mozilla 和 Opera 不愿意发布 WebSocket 协议的 Hixie 和早期 HyBi 版本就足够了。因此,IETF 决定添加客户端到服务器的数据屏蔽来解决这个问题。
顺便说一句,IETF 负责 WebSocket 协议(IETF 6455),而 W3C 负责 HTML5 WebSocket API(Javascript 对象、方法和事件)。
WebSocket 安全性的另一个方面是跨域安全性。您从 W3C WebSocket API 规范中引用的第二个片段与跨域安全性有关。WebSockets 支持跨域连接(到提供 HTML 页面的不同主机)。这个警告是说如果WebSockets 已经使用了正常的 HTTP 跨域程序,这将打开一个巨大的安全漏洞。但是,正是由于这个原因,WebSocket 过程是不同的。一方面,WebSocket 握手和响应被设计为无法与不支持 WebSocket 连接的 HTTP 服务器建立 WebSocket 连接:服务器必须以 WebSocket 特定的方式对密钥进行签名/散列,并在握手响应中返回。第二部分是浏览器必须发送一个 Origin 标头作为握手的一部分(这表明 HTML/Javascript 最初是从哪里加载的)。这允许服务器选择它将允许哪些域发起WebSocket 连接。
最后,有两种WebSocket连接方式:未加密(ws://)和加密(wss://)。加密模式使用 TLS/SSL 加密来加密发送到服务器和从服务器发送的所有数据(包括初始握手和响应)。这与用于 HTTPS 连接的加密机制相同(并在浏览器中使用相同的加密引擎)。这可以防止第三方窥探正在传输的数据。
实际上只有两个版本的 WebSocket 协议值得了解:
Hixie76:此版本的协议增加了跨域安全性和标头哈希/签名。然而,由于协议的设计方式,很难将对它的支持添加到现有的 Web 服务器。这是 iOS 目前支持的版本(希望 iOS 6 最终会更新到 IETF 6455)
IETF 6455:这是去年 11 月(2011 年 11 月)由 IETF 标准化的 WebSocket 协议版本。这是 IETF HyBi 工作组的工作成果(导致它的协议迭代被标记为 HyBi XX)。这是当前版本的 Chrome 和 Firefox 以及 IE 10 和即将推出的 Opera 支持的版本。