HTML中哪些字符需要转义?


Answers:


318

如果你在文本内容预期的位置在文档中插入文本内容1你通常只需要,你会在XML逃脱相同的字符。在元素内部,这仅包括实体转义&与号和元素定界符小于和大于符号< >

& becomes &amp;
< becomes &lt;
> becomes &gt;

在属性值内部,还必须转义使用的引号字符:

" becomes &quot;
' becomes &#39;

在某些情况下,跳过这些字符中的某些字符可能是安全的,但是我建议您在所有情况下都跳过所有五个字符,以减少犯错的机会。

如果您的文档编码不支持您正在使用的所有字符,例如,如果您尝试在ASCII编码的文档中使用表情符号,则还需要转义这些字符。如今,大多数文档都使用完全支持Unicode的UTF-8编码进行编码,而无需这样做。

通常,您不应将空格转义为&nbsp;&nbsp;不是正常的空间,而是一个不间断的空间。您可以使用这些空格代替常规空格,以防止在两个单词之间插入换行符,或者在不自动折叠的情况下插入多余的空格,但这通常是很少见的。除非您有一个设计约束,否则请不要这样做。


1所谓“期望文本内容的位置”,是指在其中包含适用常规解析规则的元素或带引号的属性值内。例如:<p>HERE</p><p title="HERE">...</p>。我上面写的内容不适用于具有特殊解析规则或含义的内容,例如脚本或样式标签内部,或作为元素或属性名称。例如:<NOT-HERE>...</NOT-HERE><script>NOT-HERE</script><style>NOT-HERE</script>,或<p NOT-HERE="...">...</p>

在这些情况下,规则更加复杂,并且引入安全漏洞要容易得多。我强烈建议您不要在任何这些位置插入动态内容。我已经看到有能力的,具有安全意识的开发人员团队通过假设他们已经正确编码了这些值而忽略了极端情况,从而引入漏洞。通常有一种更安全的选择,例如将动态值放入属性中,然后使用JavaScript处理它。

如果需要,请阅读开放式Web应用程序安全项目的XSS预防规则,以帮助您理解一些需要牢记的问题。


2
一些HTML属性值也可能具有特殊含义(JS / CSS)。因此,它也不适用于这些,例如:<p onclick="NOT-HERE">...</p><p style="NOT-HERE">...</p>
geekley


9

基本上,三个主要字符应始终在HTML和XML文件中转义,因此它们不会与其余标记交互,因此,您可能会想到,其中两个将成为语法包装器,它们是< >,它们列出如下:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

同样,我们可以将双引号(“)用作”,将单引号(')用作'

避免将动态内容放入<script>和中<style>。这些规则不适用于它们。例如,如果必须在JSON中包含JSON,则在JSON序列化之后,将<替换为\ x3c,将U + 2028字符替换为\ u2028,将U + 2029字符替换为\ u2029。)

HTML转义字符:完整列表:http : //www.theukwebdesigncompany.com/articles/entity-escape-characters.php

因此,如果后面跟可以开始字符引用的所有内容,则需要转义<或&。同样,与符号有关的规则是引用属性的唯一此类规则,因为匹配的引号是唯一将其终止的事物。但是,如果您不想在此处终止属性值,请不要使用引号。

更改为UTF-8意味着重新保存文件:

对页面使用字符编码UTF-8意味着您可以避免大多数转义的需要,而只需要处理字符。但是请注意,要更改文档的编码,仅更改页面顶部或服务器上的编码声明是不够的。您需要以该编码重新保存文档。为帮助您了解如何使用应用程序执行此操作,请阅读在Web创作应用程序中设置编码。

不可见或不明确的字符:

转义的一个特别有用的作用是表示呈现中不可见或不明确的字符。

一个示例是Unicode字符U + 200F RIGHT-TO-LEFT MARK。此字符可用于阐明双向文本中的方向性(例如,在使用阿拉伯语或希伯来语脚本时)。但是,它没有图形形式,因此很难看到这些字符在文本中的位置,如果丢失或遗忘了这些字符,它们可能会在以后的编辑过程中产生意外的结果。相反,使用(或等同于其数字字符引用的)可以很容易地发现这些字符。

U + 00A0 NO-BREAK SPACE是歧义字符的一个示例。这种类型的空格可以防止换行,但是当用作字符时,它就像其他任何空格一样。使用可以很清楚地看到文本中这些空格的位置。


3

确切答案取决于上下文。通常,这些字符不能出现(HTML 5.2§3.2.4.2.5):

文本节点和属性值必须包含Unicode字符,不能包含U + 0000字符,不能包含永久性未定义的Unicode字符(非字符),并且不能包含空格字符以外的控制字符。该规范包括对Text节点的精确值和属性值的附加约束,具体取决于它们的精确上下文。

对于HTML中的元素,文本内容模型的约束也取决于元素的类型。例如,textarea元素内的“ <”不需要在HTML中转义,因为textarea是可转义的原始文本元素。

这些限制分散在整个规范中。例如,属性值(第8.1.2.3节)不得包含歧义的“&”号,并且(i)为空,(ii)用单引号引起来(因此不能包含U + 0027 APOSTROPHE字符'),(iii)用双引号引起来(不得包含U + 0022 QUOTATION MARK字符"),或(iv)不加引号-具有以下限制:

...不得包含任何文字空格字符,任何U + 0022引号字符(“),U + 0027撇号字符('),U + 003D等于符号(=),U + 003C小于符号( <),U + 003E大于符(>)或U + 0060 GRAVE ACCENT字符(`),并且不得为空字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.