3

XMPP RFC中,有两个MUST指令声明用于 STARTTLS 和 SASL 的 XML 不得包含任何空格,因为该规范声明为“安全层字节精度”。那是什么?


来自 RFC 的相关摘要:

...

在 STARTTLS 协商期间,实体不得发送任何空格作为 XML 元素之间的分隔符(即,从发送时由 'urn:ietf:params:xml:ns:xmpp-tls' 命名空间限定的第一级元素的最后一个字符由发起实体,直到接收实体发送的由 'urn:ietf:params:xml:ns:xmpp-tls' 命名空间限定的第一级元素的最后一个字符)。此禁止有助于确保适当的安全层字节精度。

... 在 SASL 协商期间,实体不得发送任何空格作为 XML 元素之间的分隔符(即,从由 'urn:ietf:params:xml:ns:xmpp-sasl' 限定的第一级元素的最后一个字符开始)由发起实体发送的命名空间,直到接收实体发送的由 'urn:ietf:params:xml:ns:xmpp-sasl' 命名空间限定的第一级元素的最后一个字符)。此禁止有助于确保适当的安全层字节精度。

4

1 回答 1

3

该指令是为了确保正确处理字节流。想象一下,如果客户端在 XML 片段之后发送换行符,它可能会发送如下响应:

<response ... /> [LF]

服务器将逐步解析 XML 直到最终的“>”,此时它将向<success/>客户端发送一个元素。现在客户端将发送一个新的流开始,即<stream:stream ... >使用安全层。这应该会导致服务器端的安全层中断,因为它会期望额外的 LF 字符成为安全层的一部分,而实际上它不是。

您可能会说服务器应该在发出<success/>数据包之前简单地清除其接收缓冲区,但这不是处理字节流的正确方法。毕竟,底层子系统可能延迟了该 LF 字符的传递,而服务器可能会在发送<success/>数据包后收到它。

当然,解决方案是让客户端不发送此类额外数据。您可以在邮件列表中阅读有关此特定讨论的更多信息。

于 2012-08-19T21:55:02.820 回答