为什么我的 HTML 中的 CDATA 部分没有呈现?

Sle*_*led 2 html xml xhtml cdata

我正在写一份关于 HTML 中的 XML 注入攻击的报告。因此,我将拥有(损坏的)HTML 内容作为我的 HTML 的内容。因此,我试图将我的 HTML 内容包装在 CDATA 块中,但它似乎确实呈现正确。

我有(由 W3C 验证)文档:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>report</title>
    </head>
    <body>
        <div><![CDATA[AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=&lt;SCRIPT&gt;alert('XSS')&lt;/SCRIPT&gt;">]]></div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

根据我对维基百科文章的理解,这意味着内容应该“标记为解析器仅将其解释为字符数据,而不是标记”。所以输出应该是

AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=&lt;SCRIPT&gt;alert('XSS')&lt;/SCRIPT&gt;">
Run Code Online (Sandbox Code Playgroud)

然而,在两者Chrome 21.0.1180.60 mFirefox 14.0.1所有呈现的是

]]>
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?不应该从第一个<![CDATA[到第一个的所有内容都]]>出现在屏幕上,就好像每个字符都已被转义一样?

Juk*_*ela 5

CDATA 部分只能在 XML 解析模式下被浏览器识别。如您所见,在旧版 HTML 模式下,会发生奇怪的事情。

因此,您需要配置服务器以发送带有 XHTML Content-Type 的文档。这反过来会阻止旧版本的 IE(直到 IE 8)根本不呈现文档。

将 HTML 标记显示为 HTML 文档内容的实用方法是: a) 将每个显示<&lt;和每个都显示&&amp;。适用于旧版 HTML 和 XHTML。b) 将数据包装在一个xmp元素中。在遗留 HTML 中工作(仅 - 所以没有 XML Content-Type,但只是声明 XHTML doctype 无关紧要,无论如何它都会被忽略)。例子:

<xmp><![CDATA[AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=&lt;SCRIPT&gt;alert('XSS')&lt;/SCRIPT&gt;">]]></xmp>
Run Code Online (Sandbox Code Playgroud)

xmp标记还暗示了等宽字体和类似pre的渲染,其中空格受到尊重。但是这些可以用 CSS 覆盖。该xmp元素很久以前就从 HTML 规范中删除了,但浏览器支持得很好。