WebSockets是否安全?

58

维基百科 表示,WebSockets 是安全的:

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

但是w3表示它们是不安全的:

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

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

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

1. http websockets (ws:) 不安全。 2. https websockets (wss:) 是安全的。 3. 没有必要采取特殊预防措施。使用wss:协议即可保障WebSocket通信的安全性。

WebSockets就像任何其他形式的通信一样,继承了与明文交易相关的安全问题(机密性和完整性)。 - Adi
3
嗯——请解释一下“secure”的含义。和使用HTTPS时一样安全吗?是的。嗯,只要没有出现任何问题就行了。 - Chris Baker
2
我恐怕没有什么是安全的。请定义“安全”。 - kbec
嗯...如果套接字另一端的参与方积极地针对你,那么任何类型的套接字都无法解决这个问题。这是通信学的基础。 - Jon
2个回答

82

WebSocket安全涉及许多不同的方面。

您引用的维基百科片段是指WebSocket客户端到服务器数据的蒙版处理。这是为了保护行为不良的中间代理(例如代理和缓存)不会意外将WebSocket流量解释为普通的HTTP流量。危险在于WebSockets协议可能被用来毒害缓存中介。然而,我应该指出,这只是一个纯理论上的担忧,但它足以使Mozilla和Opera不愿发布Hixie和早期HyBi版本的WebSocket协议。因此,IETF决定添加客户端到服务器的数据蒙版处理以解决这个问题。

顺便说一下,IETF负责WebSocket协议(IETF 6455),而W3C负责HTML5 WebSocket API(Javascript对象、方法和事件)。

WebSocket安全的另一个方面是跨域安全。您引用的W3C WebSocket API规范的第二个片段与跨域安全有关。WebSockets支持跨域连接(与提供HTML页面的不同主机的连接)。这个警告意味着如果使用了普通的HTTP跨域程序来实现WebSocket,那么这将打开一个巨大的安全漏洞。然而,正是因为这个原因,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:这是 WebSocket 协议的一种版本,由 IETF 在去年11月(2011 年11月)进行标准化。它是 IETF HyBi 工作组的工作成果(导致其之前迭代版本被标记为 HyBi XX)。目前,Chrome 和 Firefox 的当前版本以及 IE 10 和不久的 Opera 支持此版本。


3
现今最新消息更新:iOS现在支持IETF 6455协议。链接:https://dev59.com/qW035IYBdhLWcg3wMM4G#10411901 - Jon McClung

13

WebSocket协议的版本hixie-76比早期版本更安全,版本hybi-07甚至更加安全。在hixie-76版本中添加了防止伪造请求保护机制。在hybi-07版本中添加了消息掩码


很棒的信息!例如,它们是否已经被折叠到Chrome和Firefox实现的“WebSockets”中? - cc young
请查看维基百科中的实现状态 - Denis Ibaev
RFC6455是之前版本的积累,可以这么说。再次感谢! - cc young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接