>是否必要?

14

我现在已经从事网站和XML接口的开发7年了,但从未遇到过真正需要使用 &gt; 代替 > 的情况。到目前为止,所有的消歧都可以通过引用 <&"' 来处理。

有没有人曾经遇到过(与SGML处理、浏览器问题、XSLT等相关的)情况,发现使用 &gt; 转义大于号是不可或缺的?

更新: 我刚检查了XML规范,其中在第2.4节关于字符数据中写道:

字符数据

[14]      CharData       ::=      [^<&]* - ([^<&]* ']]>' [^<&]*)
所以,即使在那种情况下,> 除了作为 CDATA 部分的结束序列之外,并没有被提及为特殊的东西。唯一一个 > 有意义的情况是 CDATA 部分的结束,即 ]]>,但是如果你引用它,引用(即字面字符串]]&gt;)将会完全出现在输出中(因为它是CDATA)。

4
也许我理解不够,但这有助于防止 HTML/JS 注入。而且,如果你的结果 HTML 需要符合 XHTML 规范,那么它是必需的。 - Nate
4
我认为这更多是为了与“&lt;”对称而非别的。 - Jonathan Leffler
1
你从来不需要这样做,因为浏览器不像编译器那样严格,它们太宽容了,因此网络上的标准被忽视。你在 JavaScript 字符串中转义 "'" 吗?(var test = 'I'll tell';) 这是同样的事情。 - Mike Gleason jr Couturier
@Nate Boss:如果您总是正确地转义 <,您能否列举出需要引用 > 以防止 HTML 注入的用例?关于 XHTML 合规性:我检查了 XML 规范,他们没有提到 > 比任何字母或其他字符更特殊。 - Boldewyn
@Mike Gleason jr Couturier:在我的问题中,我并没有特别关注浏览器,而是整个SGML/XML工具链。实际上,我更关心的是与格式良好的XML相关的问题,而不是任何浏览器怪异行为。而且,我认为,在JS中转义引号与问题无关。 - Boldewyn
@Jonathan Leffler:这也是我的印象。我只是想确认一下是否有遗漏的地方。 - Boldewyn
5个回答

7
您不一定需要这样做,因为几乎任何XML解释器都会理解您的意思。但是如果您这样做,仍然使用了没有任何保护的特殊字符。
XML与语义有关,这实际上并不符合语义规范。
关于您的更新,您忘记了这部分内容:
“右尖括号(>)可以使用字符串“ > ”来表示,并且必须为了兼容性而在内容中出现字符串“ ]]> ”时进行转义,当该字符串不标记CDATA节的结束时,必须使用字符引用或“ &gt; ”。”
文档中给出的用例更像是这样的:
<xmlmarkup>
]]>
</xmlmarkup>

这里的]]>部分可能会成为旧版SGML解析器的问题,因此出于兼容性原因,必须将其转义为]]&gt;


1
那么“几乎”部分呢?有没有任何一个未引用的>会导致问题? - Boldewyn
1
如果有人编写了一个只遵循XML标准的XML解析器,这种情况可能会发生。我不知道是否有这样的解析器,但这并不是它的错或问题。 - Colin Hebert
一个符合XML标准的XML解析器应该接受未使用引号的>。我认为你引用的这段话是指与不兼容的解析器或旧版(草案)规范的兼容性。 - Daniel
好的,再说一遍:在规范中,我发现>只有在]]> CDATA结束标记中才有任何相关性。那是一种特殊情况,因为在那里,]]&gt;没有任何作用。(顺便说一句,在整个规范中,只有这一部分包含字符串&gt; - Boldewyn
@Colin HEBERT:当您更改答案时,我写了最后一条评论(对于其他读者:我也将更新1和2合并到问题中)。 - Boldewyn

3

我在不到19小时前使用了一个XML验证器。另一种情况是当您实际上在html/xml内容文本中使用它们(而不是属性),如下所示:<

当然,宽松的解析器会接受大多数你投入其中的任何内容,但如果您担心XSS,&lt;是你的好伙伴。

更新:以下是一个需要在Firefox中转义>的示例:

<?xml version="1.0" encoding="utf-8" ?>
<test>
    ]]>
</test>

虽然如此,这仍不是一个必须转义孤立的>的例子。


实际上,如果您转义了<,您引用的示例是否也可以工作?这正是我的情况。如果不行,那么解析器是错误的,还是我在XML规范中错过了什么地方?http://w3.org/TR/xml/#NT-AttValue - Boldewyn
好的,现在我明白你想要表达的意思了。更新了帖子,并提供了一个例子,在Firefox中会出现解析错误,但是如果您从不需要转义“>”,则可以解析。 - Douglas
1
是的,现在我们在想同样的事情。柯林和我也发现了这个。至少在“SGML中的XML部分”世界中,这是唯一相关的例子,其中&gt;有意义。 - Boldewyn

3
作为一个使用网站上随意编写评论字段的用户,我更多地是使用(x)HTML文档的作者,这些字段“提供”给你插入HTML。我的意思是,如果你正确地构建你的网站,你根本不需要手动编码你的内容,对吧?所以你可以调用`htmlentities`或其他方法(很久没见了,PHP)来替换特殊字符。所以,当然,你不需要手动输入&gt;,但我希望你采取措施自动替换>

0

假设您有以下文本this is a not a ]]> nice day,并决定将其用CDATA部分包围<![CDATA[this is a not a ]]> nice day]]>

为了避免这种情况(并允许解析带有未终止标记部分的SGML片段),ISO 8879:1986的第10.4条款声明在标记部分之外出现]]>是一个错误

此外,在SGML时代,标记部分非常流行,因为它们不仅用于CDATA(如XML中),还用于RCDATA(仅允许实体和字符引用)以及IGNORE和INCLUDE(允许识别其中的标记)。

例如,在SGML中可以编写:

 <!ENTITY %WHATTODO "INCLUDE">
 <![%WHATTODO;[<b>]]&gt;</b>]]>

这相当于:

 <b>]]&gt;</b>

0

我刚想到另一个例子,需要在HTML5(而不是XHTML5)文档中引用>:如果您需要在没有引号的属性中使用它(当然这是可以争论的事情)。

<img src=arrow.png alt=&gt;>

应该等同于XHTML

<img src="arrow.png" alt=">" />

但是,话说回来,(?<!X)HTML并不是SGML。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接