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

它们是否与XML相同,也许加上空格( )?

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

563606 次浏览

如果你在你的文档中插入文本内容,在一个文本内容需要__abc3, 您通常只需要像在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应用程序安全项目的跨站防御规则来帮助理解一些你需要记住的问题。

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

  • 文档主体
  • 在公共属性内部
  • 内部脚本标记
  • 内部样式标签
  • 几个!

参见OWASP的防止跨站点脚本编写备忘单,特别是"为什么我不能只是HTML实体编码不受信任的数据?"和"跨站防御规则"部分。但是,最好阅读整个文档。

基本上,在你的HTML和XML文件中有三个主要人物应该总是转义,所以它们不会与其他标记交互,所以正如你可能期望的那样,其中两个将是语法包装器,分别是<>它们如下所示:

 1)  &lt; (<)
    

2)  &gt; (>)
    

3)  &amp; (&)

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

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

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

所以你需要转义<或者&当后面跟着任何可以开始字符引用的东西时。同样,对于带引号的属性,关于&号的规则是唯一这样的规则,因为匹配的引号是唯一会终止一个属性的东西。但如果您不想在此处终止属性值,请转义引号。

< p > 更改为UTF-8意味着重新保存文件: < br > < br > 为页面使用字符编码UTF-8意味着可以避免 大多数的越狱都是针对角色的。但是,请注意 改变文档的编码,仅仅改变是不够的 页面顶部或服务器上的编码声明。你 需要以该编码重新保存文档。为了帮助理解 如何与您的应用程序读取设置编码在web 编写应用程序。< / p >

无形的或模糊的字符:

转义的一个特别有用的角色是表示那些

一个例子是Unicode字符U+200F从右到左MARK。这 字符可用于明确双向文本的方向性 (如。当使用阿拉伯语或希伯来语脚本时)。它没有图形形式, 然而,因此很难看到这些字符是在 文本,如果它们丢失或遗忘,可能会造成意想不到的后果 在以后的编辑过程中产生的结果。使用` `(或其数字字符 Reference equivalent)反而使它很容易被发现 这些字符。< / p > 一个模糊字符的例子是U+00A0 NO-BREAK SPACE。这 类型的空间防止断行,但它看起来就像任何其他 用作字符时的空格。使用使它 空格在文本中出现的位置非常清楚

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

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

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

这些限制分散在规范中。例如,属性值(§8.1.2.3)必须不包含模棱两可的&,并且必须是(我)空,(2)在单引号内(因此必须不包含U+0027撇号字符'), (3)在双引号内(必须不包含U+0022引号字符"),或(iv)不带引号-具有以下限制:

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

如果你想使用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;
}