websocket是否安全?

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

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

但是w3表示他们不安全:

遵循HTTP过程可能会在Web浏览器上下文中引入严重的安全问题。 例如,考虑在一个path上使用WebSocket服务器的主机,在另一个path上使用打开的HTTPredirect器。 突然之间,即使脚本检查到URL有正确的主机名,任何可以被赋予特定WebSocket URL的脚本都可能被欺骗,从而与Internet上的任何主机进行通信(并可能与其共享秘密)。

  1. http websockets (ws :)安全吗?

  2. https websockets (wss :)安全吗?

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

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

你引用的维基百科的snippit是指WebSocket客户端到服务器数据的屏蔽。 这是为了防止行为不端的中介(例如代理和caching)意外地将WebSocketstream量解释为正常的HTTPstream量。 这里的危险是WebSockets协议可能被用来毒化caching中介。 不过,我应该注意到,这纯粹是理论上的问题,但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握手和响应的devise使WebSocket不能连接到不支持WebSocket连接的HTTP服务器:服务器必须以特定于WebSocket的方式签署/散列密钥,并在握手响应中返回该密钥。 第二部分是浏览器必须发送一个Origin头部作为握手的一部分(这表示HTML / Javascript最初是从哪里加载的)。 这允许服务器select允许哪些域发起 WebSocket连接。

最后,有两种WebSocket连接模式:未encryption(ws://)和encryption(wss://)。 encryption模式使用TLS / SSLencryption来encryption发往和来自服务器的所有数据(包括初始握手和响应)。 这与用于HTTPS连接的encryption机制相同(并且在浏览器中使用相同的encryption引擎)。 这可以防止第三方窥探正在传输的数据。

实际上只有两个版本的WebSocket协议值得了解:

  • Hixie76 :该版本的协议添加了跨源安全性和头散列/签名。 但是,由于协议的devise方式,很难将其支持添加到现有的Web服务器上。 这是目前在iOS中支持的版本(希望iOS 6将最终更新到IETF 6455)

  • IETF 6455 :这是去年十一月(2011年11月)由IETF标准化的WebSocket协议版本。 这是IETF HyBi工作组的工作的高潮(导致该协议的迭代被标记为HyBi XX)。 这是当前版本的Chrome和Firefox以及IE 10和Opera即将支持的版本。

WebSocket协议的版本hixie-76比早期的版本更安全,版本hybi-07更加安全。 hixie-76版本增加了防伪请求 。 在Hybi-07版本添加消息掩码 。