55

维基百科似乎推断websockets是安全的:

对于 Web 浏览器支持,WebSocket 协议的安全版本在 Firefox 6(名为 MozWebSocket)、[2] Google Chrome 14[3] 和 Internet Explorer 10 开发者预览版中实现。...虽然没有已知的漏洞利用,但它在 Firefox 4 和 5 中被禁用...

w3表示它们不安全:

在此处遵循 HTTP 过程可能会在 Web 浏览器上下文中引入严重的安全问题。例如,考虑一个主机,在一个路径上有一个 WebSocket 服务器,在另一个路径上有一个开放的 HTTP 重定向器。突然之间,任何可以被赋予特定 WebSocket URL 的脚本都可能被诱骗与 Internet 上的任何主机通信(并可能与之共享机密),即使该脚本检查该 URL 是否具有正确的主机名也是如此。
  1. (ws:)是否http websockets安全?

  2. (wss:)是否https websockets安全?

  3. 如果不是#2,是否有记录在案的预防措施?

4

2 回答 2

79

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 支持的版本。

于 2012-06-21T15:31:18.840 回答
12

WebSocket 协议的 hixie-76 版本比早期版本更安全,hybi-07 版本更安全。在 hixie-76 版本中增加了对虚假请求的保护。在 hybi-07 版本中添加了消息屏蔽

于 2012-06-21T07:32:51.830 回答