### PCDATA 和 CDATA 的区别

PCDATA

PCDATA 是 可解析字符数据。在XML或HTML中，当解析器遇到 PCDATA 时，它会解析其中的特殊字符。这意味着，如果你的数据中包含 `<`、`>`、`&` 等字符，解析器会将其视为标签或实体的开始

例如，在XML中：

    <note>
      <body>这是一个 &lt;b&gt;粗体&lt;/b&gt; 文本。</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区域，而没有进行充分的转义时，攻击者可以注入 XSS 等代码 | 除非应用程序对 CDATA 块本身进行了处理或二次解析，否则在 CDATA 内部直接进行注入攻击是无效的