【问题标题】:C# XmlDocument modifies data when you load it?C# XmlDocument 在加载时修改数据?
【发布时间】:2010-10-12 20:52:47
【问题描述】:

我正在从第 3 方(其签名的 xml)接收 Base64 编码的 saml 断言。我无法验证签名。经过仔细检查,似乎当我在 SAML xml 中读取 XmlDocument 更改了数据时。请参阅此代码:

string rawXml = Util.DecodeBase64(SAMLResponse);
byte[] b = Encoding.UTF8.GetBytes(rawXml);
MemoryStream s = new MemoryStream();

s.Write(b, 0, b.Length);
s.Flush();
s.Position = 0;
XmlDocument xml = new XmlDocument();
xml.PreserveWhitespace = true;
xml.Load(s);


MemoryStream s2 = new MemoryStream();
xml.Save(s2);
s2.Position = 0;
byte[] b2 = new byte[s2.Length];
s2.Read(b2, 0, b2.Length);

b 的长度为 6410 字节,其中 b2 的长度为 6416,当我添加时

int diffcount = 0;
for (int x = 0; x < b2.Length; x++)
{
    if(x > b.Length-1 || b[x]!=b2[x])
    diffcount++;
}

difffcount 结果是 5572

任何想法如何让 xmldocument 保留字节值? 谢谢

【问题讨论】:

  • 使用真正的 diff 机制,具体的变化是什么? :-) 只有 6 个字节,我想这将是用于表示 XML 不安全构造的特定编码的变化(如果差异计数为 ~6410,我想添加 Unicode 控制数据)。
  • 是的,你是对的......我做了更多的查看,发现在属性关闭引号后没有空格的自关闭元素和 /> 获得由 XmlDocument 添加的空格
  • 有没有办法让 XmlDocument 保留空白。在这种情况下,将 preservewhitespace 设置为 true 似乎并没有多大作用

标签: c# xmldocument


【解决方案1】:

同样的困境:csharp,验证传入的 SAML 签名 xml,作为 base64 编码的 xml 字符串接收 - 但从它创建的 xml 文档会输出更多字节。事实证明,这些不仅是在 .net 输出中插入的自闭合元素的额外空格,而且在原始输入字符串只有“\n”的情况下使用“\r\n”换行。

所以现在我测试这些功能的输入字符串(没有前面空格的自动关闭元素?只有“\n”用于换行?)然后在整个验证签名 xml 的过程中(摘要值、签名)我确保任何中间 xml 文档都将从 [xmlString].Replace(" />", "/>") 和/或 [xmlString].Replace("\r\n" 以相同方式准备的字符串创建, "\n")。这确实有所不同,因此显然 .net xml 文档在内部确实坚持使用它创建的原始输入字符串。

但有一个例外:还有一个情况是,我收到一个 xml 字符串,其中没有用于自闭合元素的额外空格,但具有完整的 "\r\n" 换行序列。但是,按照我上面提到的程序 - [xmlString].Replace(" />", "/>") - 我无法在 xml 中复制 SignatureValue 和 DigestValue;但是,如果在这种情况下我还替换了换行序列 - [xmlString].Replace("\r\n", "\n") - 我得到了正确的值。显然,在这种情况下,SignatureValue 和 DigestValue 首先仅使用“\n”作为换行符进行计算,然后 - 当 xml 文档采用 Base64 编码时 - 使用了包含“\r\n”的字符串。

出于验证目的,最后似乎只有换行序列的差异很重要,因为自闭合元素的额外空格将在规范化(引入显式结束标记时)后消失,这通常在计算 DigestValue 和 SignatureValue 之前.

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多