websockets安全与否?

时间:2012-06-21 06:45:46

标签: javascript html html5 websocket

wikipedia似乎推断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. http websockets(ws :)安全与否?

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

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

2 个答案:

答案 0 :(得分:73)

WebSocket安全性有很多不同的方面。

您引用的维基百科的snippit指的是将WebSocket客户端屏蔽到服务器数据。这是为了保护行为不端的中间人(例如代理和缓存)不会将WebSocket流量意外地解释为正常的HTTP流量。这里的危险是WebSockets协议可能被用来毒化缓存中介。但是,我应该注意到这只是一个纯粹的理论问题,但是Mozilla和Opera不愿意发布Hixie和早期HyBi版本的WebSocket协议就足够了。因此,IETF决定将客户端添加到服务器屏蔽数据以解决问题。

另外,IETF负责WebSocket协议(IETF 6455),而W3C负责HTML5 WebSocket API(Javascript对象,方法和事件)。

WebSocket安全性的另一个方面是跨源安全性。您从W3C WebSocket API规范引用的第二个snippit与跨源安全性有关。 WebSockets支持跨源连接(到提供HTML页面的不同主机)。此警告表示如果正常的HTTP跨源程序已用于WebSockets,这将打开一个巨大的安全漏洞。但是,WebSocket过程正是出于这个原因而不同。首先,WebSocket握手和响应的设计使得无法将WebSocket连接发送到不支持WebSocket连接的HTTP服务器:服务器必须以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支持的版本。

答案 1 :(得分:12)

WebSocket协议版本hixie-76比早期版本更安全,版本hybi-07更安全。在hixie-76版本中添加了protection against fake requests。在hybi-07版本中添加了message masking