在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'命名空间限定的第一级元素的最后一个字符。 此禁止有助于确保正确的安全层字节精度。
答案 0 :(得分:3)
该指令用于确保正确处理字节流。想象一下,如果客户端在XML片段之后发送换行符,它可能会发送如下响应:
<response ... /> [LF]
服务器将逐步解析XML直到最后的'&gt;',此时它会将<success/>
元素发送回客户端。现在,客户端将使用安全层发送新的流开始,即<stream:stream ... >
。这应该导致安全层在服务器端中断,因为它不希望额外的LF字符成为安全层的一部分。
您可能会说服务器应该在发出<success/>
数据包之前清除其接收缓冲区,但这不是处理字节流的正确方法。毕竟,底层子系统可能延迟了该LF字符的传递,服务器可能在发送<success/>
数据包后收到它。
当然,解决方案是客户端不发送这样的额外数据。您可以在邮件列表中阅读有关此特定讨论here的更多信息。