PCDATA 和 CDATA 的区别
PCDATA
PCDATA 是 可解析字符数据。在XML或HTML中,当解析器遇到 PCDATA 时,它会解析其中的特殊字符。这意味着,如果你的数据中包含 <
、>
、&
等字符,解析器会将其视为标签或实体的开始
例如,在XML中:
<note>
<body>这是一个 <b>粗体</b> 文本。</body>
</note>
这里的 <
会被解析成 <
,>
会被解析成 >
。如果你在XML元素中直接写入 <script>
标签,解析器会把它当作一个新的节点来处理,而不是纯粹的文本内容。在渗透测试中,如果一个 Web 应用将用户输入作为 PCDATA 处理,但没有进行充分的过滤,攻击者可以注入恶意代码,如 XSS (跨站脚本) 攻击
CDATA
CDATA 是 不可解析字符数据。与 PCDATA 相反,解析器会将其中的所有内容都视为纯文本,不会对 <
、>
、&
等特殊字符进行解析。CDATA 块通常用 <![CDATA[ ... ]]>
语法来定义
例如,在XML中:
<note>
<script_code><![CDATA[
if (x < 10 && y > 5) {
alert('Hello!');
}
]]></script_code>
</note>
在这个例子中,CDATA
块内的所有内容,包括 <
、>
、&
,都会被原封不动地当作字符串来处理。即使代码中包含了类似HTML 标签的字符,解析器也不会将它们当作标签来处理。这使得 CDATA 在需要嵌入包含特殊字符的文本(如代码片段、JavaScript 等)时非常有用
特性 | PCDATA (可解析字符数据) | CDATA (不可解析字符数据) |
---|---|---|
解析方式 | 解析特殊字符(<、>、& 等) | 将所有内容视为纯文本,不解析特殊字符 |
主要用途 | 包含普通的、可解析的文本内容 | 包含代码、脚本或其他含有特殊字符的文本 |
攻击风险 | 高。如果对用户输入处理不当,容易导致 XSS、XML 实体注入等漏洞。 | 低。由于其内容被视为纯文本,它能有效防止特殊字符被解释为标签或代码。 |
攻击场景 | 当应用程序将用户输入直接放入PCDATA区域,而没有进行充分的转义时,攻击者可以注入 等代码。 | 除非应用程序对 CDATA 块本身进行了处理或二次解析,否则在 CDATA 内部直接进行注入攻击是无效的。 |