333

它们是否与 XML 相同,可能加上空格一 (  )?

我发现了一些巨大的 HTML 转义字符列表,但我认为不必对它们进行转义。我想知道需要逃避什么。

4

5 回答 5

422

如果您将文本内容插入文档中预期文本内容的位置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</style><p NOT-HERE="...">...</p>

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

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

于 2011-09-11T23:34:01.467 回答
21

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

  • 文件正文
  • 里面的共同属性
  • 内部脚本标签
  • 内部风格标签
  • 还有几个!

请参阅 OWASP 的Cross Site Scripting Prevention Cheat Sheet,尤其是“为什么我不能只对 HTML 实体编码不受信任的数据? ”和“ XSS 预防规则”部分。但是,最好阅读整个文档。

于 2011-09-12T01:06:36.033 回答
11

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

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

我们也可以使用双引号 (") 作为 ",单引号 (') 作为 &apos

避免将动态内容放入<script><style>。这些规则不适用于他们。例如,如果您必须在 a 中包含 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。这种类型的空格可以防止换行,但当用作字符时,它看起来就像任何其他空格一样。Using 可以很清楚地知道这些空格在文本中出现的位置。

于 2017-05-02T12:42:09.703 回答
3

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

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

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

这些限制分散在规范中。例如,属性值 ( §8.1.2.3 ) 不得包含不明确的 & 符号,并且(i)为空,(ii)在单引号内(因此不得包含 U+0027 APOSTROPHE 字符'),(iii)在双引号内 (不得包含 U+0022 QUOTATION MARK character "),或(iv) unquoted — 有以下限制:

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

于 2018-04-11T02:27:50.657 回答
0

如果您想使用 JavaScript 转义一串标记,则有:

或者,如果您不想引入依赖项,这里是同样的事情,虽然速度稍慢,因为它使用split/map/join而不是charCodeAt/substring.

function escapeMarkup (dangerousInput) {
  const dangerousString = String(dangerousInput);
  const matchHtmlRegExp = /["'&<>]/;
  const match = matchHtmlRegExp.exec(dangerousString);
  if (!match) {
    return dangerousInput;
  }

  const encodedSymbolMap = {
    '"': '&quot;',
    '\'': '&#39;',
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;'
  };
  const dangerousCharacters = dangerousString.split('');
  const safeCharacters = dangerousCharacters.map(function (character) {
    return encodedSymbolMap[character] || character;
  });
  const safeString = safeCharacters.join('');
  return safeString;
}
于 2022-02-14T22:38:46.723 回答