在HTML中哪些字符需要转义?

在HTML中哪些字符需要转义?,html,html-entities,html-encode,html-escape-characters,Html,Html Entities,Html Encode,Html Escape Characters,它们是否与XML相同,或者加上空格() 我发现了一些巨大的HTML转义字符列表,但我认为它们不必转义。我想知道需要转义哪些内容。如果要在文档中预期文本内容的位置插入文本内容1。在元素内部,这只包括实体转义符和&以及小于和大于符号的元素分隔符: &been&; 变成 在属性值内,还必须转义正在使用的引号字符: “变成” '变成'; 在某些情况下,跳过其中一些字符可能是安全的,但我鼓励您在所有情况下都跳过所有五个字符,以减少犯错误的机会 如果您的文档编码不支持您正在使用的所有字符,例

它们是否与XML相同,或者加上空格(


我发现了一些巨大的HTML转义字符列表,但我认为它们不必转义。我想知道需要转义哪些内容。

如果要在文档中预期文本内容的位置插入文本内容1。在元素内部,这只包括实体转义符和
&
以及小于和大于符号的元素分隔符

&been&;
<变成
>变成
在属性值内,还必须转义正在使用的引号字符:

“变成”
'变成';
在某些情况下,跳过其中一些字符可能是安全的,但我鼓励您在所有情况下都跳过所有五个字符,以减少犯错误的机会

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

一般来说,不应将空格转义为
<代码>不是一个普通的空格,它是一个空格。您可以使用这些空格而不是普通空格来防止在两个单词之间插入换行符,或者在不自动折叠的情况下插入额外空格,但这种情况通常很少见。除非有需要的设计约束,否则不要这样做


1所说的“预期文本内容的位置”,我指的是在一个元素或引用的属性值内部,正常的解析规则适用。例如:
此处

。我上面写的不适用于具有特殊解析规则或含义的内容,例如脚本或样式标记内部,或作为元素或属性名称。例如:
..
不在这里
不在这里
,或

在这些情况下,规则更加复杂,更容易引入安全漏洞我强烈建议您不要在这些位置插入动态内容。我看到有能力的安全意识开发人员团队通过假设他们正确编码了这些值,但缺少一个边缘案例来引入漏洞。通常有一种更安全的替代方法,例如将动态值放入属性中,然后使用JavaScript处理它


如果必须,请阅读以帮助理解您需要记住的一些问题。

这取决于上下文。HTML中的一些可能上下文:

  • 文件正文
  • 内部公共属性
  • 内部脚本标记
  • 内部样式标记
  • 还有几个

请参阅OWASP,特别是“”和“”部分。但是,最好阅读整个文档。

基本上,HTML和XML文件中有三个主要字符应始终转义,因此它们不会与其他标记交互,因此正如您可能预期的那样,其中两个将成为语法包装器,它们如下所示:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)
1)()
3) &;(&)
我们还可以使用双引号(“)as”和单引号(')as&apos

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

HTML转义字符:完整列表:


所以你需要逃避确切的答案取决于上下文。通常,这些字符不能出现():

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


对于HTML中的元素,文本内容模型的约束也取决于元素的种类。例如,“一些HTML属性值可能也有特殊的含义(JS/CSS)。因此它也不适用于这些,例如: