为什么我的HTML中的CDATA部分无法呈现?

时间:2012-08-07 17:07:46

标签: html xml xhtml cdata

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

我有(validated by 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>

根据我对Wikipedia article的理解,这意味着内容应该“标记为解析器只能解释为字符数据,而不是标记”。所以输出应该是

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[到第一个]]>的所有内容都出现在屏幕上,好像每个角色都已被转义一样?

1 个答案:

答案 0 :(得分:4)

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

因此,您需要配置服务器以使用XHTML Content-Type发送文档。这反过来会阻止旧版本的IE(直到IE 8)完全不渲染文档。

将HTML标记显示为HTML文档内容的实用方法是: a)将每个<显示为&lt;,将每个&显示为&amp;。适用于XHTML中的旧版HTML和。 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>

xmp标记还暗示了等宽字体和pre - 就像渲染空白一样。但是这些可以用CSS覆盖。 xmp元素很久以前就从HTML规范中删除了,但浏览器很好地支持了它。