为什么我需要逃避<和&在渲染属性时?

时间:2017-01-03 23:35:58

标签: c# html asp.net .net

我正在阅读HtmlAttributeEncode的文档,正如我所理解的那样,它旨在用于呈现双引号内的HTML作为属性,例如。

<INPUT Value="This value must be escaped so that it doesn't contain any quotes">

据我所知,我需要逃脱的唯一角色是双引号。浏览器应该能够找出该字符串中属于该属性的所有其他内容。

那么,为什么文件说这个呢?

  

HtmlAttributeEncode方法仅将引号(&#34;),&符号(&amp;)和左尖括号(&lt;)转换为等效的字符实体。它比HtmlEncode方法快得多。

事实上它确实逃脱了这些,this poor guy可以看出。

有没有理由逃避&lt;和&amp;在这种情况下的人物?它是否需要HTML5规范?

凭借我的人眼,我可以很容易地看到划界开始和结束的角色序列:

<INPUT value="You & I can both easily see that 5 < 6!">

只要双引号序列正确关闭(双引号被转义),我就不明白为什么其他字符必须是HTML编码的。

1 个答案:

答案 0 :(得分:2)

来自规格:

  

3.2.3.1 Attributes

     

除非另有说明,否则HTML元素的属性可能包含任何字符串值,包括空字符串。除非明确说明,否则对此类属性中可指定的文本没有限制。

根据specs of html4value属性的内容应为cdata类型。

来自HTML Document Representation

  

5.3.2字符实体引用

     

四个字符实体引用值得特别提及,因为它们经常用于转义特殊字符:

     

&#34; &lt;&#34;代表&lt;签字。
  &#34; &gt;&#34;表示&gt;签字。
  &#34; &amp;&#34;代表&amp;签字。
  &#34; &quot;&#34;代表&#34;标记。

     

作者希望将&#34;&lt;&#34;文字中的字符应使用&#34; &lt;&#34; (ASCII十进制60)以避免可能与标记的开头混淆(开始标记打开分隔符)。同样,作者应该使用&#34; &gt;&#34; (ASCII十进制62)在文本而不是&#34;&gt;&#34;避免旧的用户代理在出现在带引号的属性值中时错误地将其视为标记结尾(标记关闭分隔符)的问题。

     

作者应使用&#34;&amp;&#34; (ASCII十进制38)代替&#34;&amp;&#34;避免与字符引用(实体引用打开分隔符)的开头混淆。 作者也应该使用&#34;&amp;&#34;在属性值中,因为在CDATA属性值中允许字符引用。