【发布时间】:2025-11-30 05:15:01
【问题描述】:
在 XML 文档中使用 CDATA 元素是否存在漏洞?如果是这样,如果我们在 XML 文档中使用 CDATA 元素会发生什么?
【问题讨论】:
在 XML 文档中使用 CDATA 元素是否存在漏洞?如果是这样,如果我们在 XML 文档中使用 CDATA 元素会发生什么?
【问题讨论】:
我不知道您所说的“漏洞”是什么意思,但是很多人在使用 CDATA 部分时会犯一个错误。当一个懒惰的程序员并不真正理解文本转义并试图避免&-在 XML 中编码特殊字符的正常过程时,就会发生这种情况。他们认为他们可以侥幸逃脱:
print "<element><![CDATA["+textstring+"]]></element>";
虽然这确实会阻止textstring 中的< 或& 字符被视为标记,但它不是无懈可击的,因为文本字符串可能包含]]> 序列,从而导致:
<element><![CDATA[ Foo ]]> <bar>I'm an unexpected element!</bar> ]]></element>
这是一种 XML 注入,与 HTML 注入一样,它可能会产生类似 XSS 的安全影响。
因此,您仍然需要转义 CDATA 中的某些序列(通常,您会在两个 CDATA 部分之间拆分 ]]> 序列)。在实践中,使用 CDATA 并不比 &-以正常方式对文本内容进行编码更容易。所以真的没有理由使用 CDATA 部分。
【讨论】:
CDATA 部分只是在 XML 文档中表示字符数据的另一种方式。它的含义与文档中的任何其他(非标记)文本完全相同,只是它的转义方式不同。
没有与 CDATA 相关的额外“漏洞”(当然,您的 XML 解析库中的错误除外)。
【讨论】:
&-转义的,并不意味着解析器会将其发送给它们以作为命令执行,那太疯狂了。它将以与任何其他纯文本相同的方式处理。
]]> 结束序列。其他所有内容都被视为字符数据。
易受什么影响?某种注入攻击? CDATA 告诉解析器传递内容而不解析它,所以如果您正在验证您的 XML,我想 CDATA 部分会错过验证步骤。
使用 XML 流的代码应该在架构验证之外进行某种业务验证,因此只有在使用输入之前未能检查输入,您才会面临风险。
【讨论】: