2

我正在写一份关于 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>

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

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

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

]]>

到底是怎么回事?<![CDATA[从第一个到第一个的所有内容不应该都]]>出现在屏幕上,就好像每个角色都被逃脱了吗?

4

1 回答 1

5

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

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

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

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

xmp标记还暗示了等宽字体和类似pre呈现空白的地方。但是这些可以用 CSS 覆盖。该xmp元素很久以前就从 HTML 规范中删除了,但浏览器很好地支持了该元素。

于 2012-08-07T17:38:40.953 回答