为什么WebSockets在握手中使用哈希?

时间:2013-05-15 03:22:25

标签: javascript web websocket

要打开Websocket,客户端连接到服务器上的tcp套接字,然后开始握手。

客户端的握手包含base64编码密钥(Sec-WebScoket-Key)。

服务器应该使用SHA-1(key + magic_constant),base64编码进行响应。 magic_constant是一个特定于协议的字符串(Sec-Websocket-Accept)。

这是为了什么目的?我没有看到任何明显的安全理由。它不会对任何一方进行身份验证。单个SHA-1计算对于工作证明来说并不多。

1 个答案:

答案 0 :(得分:3)

这部分握手的目的是确保连接的两端都是真正的WebSocket参与者。它旨在为真正的WebSocket客户端和服务器轻松实现,但攻击者很难欺骗HTTP客户端,服务器或代理假装成WebSocket参与者。特别是,如果在浏览器中运行的一段恶意JavaScript可以打开与普通HTTP服务器的WebSocket连接,那将是很糟糕的,因为一旦建立连接,JavaScript就可以完全控制通过该通道发送的内容并可以尝试各种格式错误的超大数据,试图破坏或取消服务器。

<强>更新

正如@notallama所指出的,创建恶意WebSocket客户端或使用telnet发送恶意数据很容易。不同之处在于,对于WebSockets,攻击来自可信上下文(用户的浏览器和用户的网络)。浏览器从Internet加载不受信任的代码,但通常用于连接到不暴露于Internet的HTTP服务器和中介。作为一个极端的例子,想象一下,如果不是WebSockets,浏览器可以打开原始TCP连接(没有强制CORS,哈希检查等)。现在,恶意的JavaScript可以在用户家庭网络上做任何想做的事情(或者更糟糕的是,他们的工作场所内部网)。

特别是,HyBi工作组花费了大量时间来解决HTTP中介中的理论漏洞,这种漏洞会通过使用WebSocket连接来欺骗中介,使其认为他们正在与普通的HTTP客户端通信。