什么是WebSocket框架中的掩码?

我在websocket实现上工作,不知道在一个框架中的面具的感觉。

有人可以解释我做了什么,为什么这是build议?

0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK set to 1 | +-------------------------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+ 

Websocket在RFC6455中定义,在5.3节中说明 :

屏蔽键的不可预测性对于防止恶意应用程序的作者select线上显示的字节至关重要。

在关于Websockets的博客中,我find了以下解释:

掩码键(32位):如果掩码位被设置(并相信我,这是如果你写服务器端),你可以读取无符号字节在这里用于异或有效载荷。 它被用来确保恶意代理不能被来自客户端的攻击者滥用

但是,我在邮件列表存档中find了最清楚的答案。 那里约翰·坦普林说:

基本上,WebSocket的独特之处在于,即使在客户端运行恶意代码,对服务器进行充分的敌意控制,您仍然需要保护networking基础架构,唯一可以信任的就是客户端浏览器。 通过让浏览器为每一帧生成一个随机掩码,恶意客户端代码就不能select出现在networking上的字节模式,并用它来攻击易受攻击的networking基础设施

如kmkaplan所述,攻击媒介在RFC 第10.3节中有描述。
这是防止代理caching中毒攻击的措施(请参阅关于攻击的文章 )。 它所做的是创造一些随机性。 您必须使用随机掩码键对有效载荷进行异或运算。

顺便说一句:这不只是build议。 这是强制性的

从这篇文章 :

由于恶意代码不太可能导致某些破坏的代理执行错误的操作并将其用作某种攻击,所以需要屏蔽WebSocket从客户端到服务器的stream量。 没有人certificate这实际上可能发生,但是由于事实上它可能发生的事实足以让浏览器供应商变得t,不安,所以添加了掩蔽以消除它被用作攻击的可能性。

因此,假设攻击者能够破坏在浏览器和后端服务器中执行的JavaScript代码,masking旨在防止在这两个端点之间发送的字节序列以特殊的方式制作,可以破坏任何破坏的代理在这两个端点之间(这意味着代理可能尝试将websocketstream解释为HTTP,实际上它们不应该)。

浏览器(而不是浏览器中的JavaScript代码)在用于发送消息的随机生成的掩码上有最后的发言权,这就是为什么攻击者不可能知道代理可能看到的最终字节stream是什么。

请注意,如果您的WebSocketstream被encryption(如果它应该是),则掩码是多余的。 Python's Flask作者的文章 :

为什么屏蔽呢? 因为显然有足够的基础设施,让升级头通过,然后处理其余的连接作为第二个HTTP请求,然后填充到caching中。 我对此没有任何言论。 无论如何,对此的防御基本上是一个强大的32位随机数作为屏蔽键。 或者你知道…使用TLS,不要使用低级代理。