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