【问题标题】:Using CDATA element in XML is vulnerable or not?在 XML 中使用 CDATA 元素是否易受攻击?
【发布时间】:2025-11-30 05:15:01
【问题描述】:

在 XML 文档中使用 CDATA 元素是否存在漏洞?如果是这样,如果我们在 XML 文档中使用 CDATA 元素会发生什么?

【问题讨论】:

    标签: xml cdata


    【解决方案1】:

    我不知道您所说的“漏洞”是什么意思,但是很多人在使用 CDATA 部分时会犯一个错误。当一个懒惰的程序员并不真正理解文本转义并试图避免&-在 XML 中编码特殊字符的正常过程时,就会发生这种情况。他们认为他们可以侥幸逃脱:

    print "<element><![CDATA["+textstring+"]]></element>";
    

    虽然这确实会阻止textstring 中的&lt;&amp; 字符被视为标记,但它不是无懈可击的,因为文本字符串可能包含]]&gt; 序列,从而导致:

    <element><![CDATA[ Foo ]]> <bar>I'm an unexpected element!</bar> ]]></element>
    

    这是一种 XML 注入,与 HTML 注入一样,它可能会产生类似 XSS 的安全影响。

    因此,您仍然需要转义 CDATA 中的某些序列(通常,您会在两个 CDATA 部分之间拆分 ]]&gt; 序列)。在实践中,使用 CDATA 并不比 &amp;-以正常方式对文本内容进行编码更容易。所以真的没有理由使用 CDATA 部分。

    【讨论】:

      【解决方案2】:

      CDATA 部分只是在 XML 文档中表示字符数据的另一种方式。它的含义与文档中的任何其他(非标记)文本完全相同,只是它的转义方式不同。

      没有与 CDATA 相关的额外“漏洞”(当然,您的 XML 解析库中的错误除外)。

      【讨论】:

      • 但是如果在 cdata 元素之间输入的文本没有被解析器解析会发生什么。恶意用户可以保留某种类型的数据,这些数据会提取目标应用程序的所有系统命令,因为它没有被 xml 解析器解析。我认为这是一种漏洞。
      • 仅仅因为 CDATA 部分中的内容不是&amp;-转义的,并不意味着解析器会将其发送给它们以作为命令执行,那太疯狂了。它将以与任何其他纯文本相同的方式处理。
      • CDATA 块中的数据解析器解析。具体来说,XML 解析器正在寻找]]&gt; 结束序列。其他所有内容都被视为字符数据。
      • 那么什么是强制解析攻击?
      • 如果您的问题是关于您在某处读到的特定类型的攻击,那么请提出那个问题,而不是试图让我们读懂您的想法。
      【解决方案3】:

      易受什么影响?某种注入攻击? CDATA 告诉解析器传递内容而不解析它,所以如果您正在验证您的 XML,我想 CDATA 部分会错过验证步骤。

      使用 XML 流的代码应该在架构验证之外进行某种业务验证,因此只有在使用输入之前未能检查输入,您才会面临风险。

      【讨论】: