当我需要转义Html字符串时?

2022-09-04 01:09:02

在我的遗留项目中,我可以看到在字符串发送到浏览器之前escapeHtml的用法。

StringEscapeUtils.escapeHtml(stringBody);

我从api doc知道escapeHtml做了什么.这里给出的例子:-

For example: 
"bread" & "butter"
becomes: 
"bread" & "butter".

我的理解是,当我们在转义html后发送字符串时,浏览器的责任是转换回原始字符。是吗?

但是我不明白为什么以及何时需要它,如果我们发送字符串正文而不转义html会发生什么?如果我们在将exescapeHtml发送到浏览器之前不做escapeHtml,成本是多少?


答案 1

我可以想到几种可能性来解释为什么有时字符串没有被转义:

  • 也许最初的程序员相信在某些地方字符串没有特殊字符(但是,在我看来,这将是糟糕的编程实践;为了防止将来的更改,转义字符串的成本非常低)
  • 该字符串在代码中的该点已被转义。你绝对不想两次转义一个字符串;用户最终将看到转义序列而不是预期的文本。
  • 该字符串是实际的 html 本身。你不想逃避html;你希望浏览器处理它!

编辑 - 转义的原因是特殊字符喜欢并且最终可能导致浏览器显示您预期之外的内容。从技术上讲,裸露是 html 中的错误。大多数浏览器都试图智能地处理此类错误,并且在大多数情况下会正确显示它们。(例如,如果字符串是 中的文本,则几乎肯定会在示例文本中发生这种情况。但是,由于它是糟糕的标记,因此某些浏览器将无法正常工作;辅助技术(例如文本到语音转换)可能会失败;可能还有其他问题。&<&<div>

尽管浏览器尽最大努力从错误的标记中恢复,但仍有几种情况会失败。如果示例字符串是属性值,则绝对需要转义引号。浏览器无法正确处理以下情况:

<img alt=""bread" & "butter"" ... >

一般规则是,任何不是标记但可能被混淆为标记的字符都需要转义。

请注意,在多个上下文中,文本可以出现在 html 文档中,并且它们对转义有单独的要求。应转义以下内容:

  • 文档字符集中没有表示形式的所有字符(如果您使用的是 UTF-8,则不太可能,但情况并非总是如此)
  • 在属性值中,引号(或 ,与属性值本身使用的分隔符匹配的任何一个)和 & 符号 (),但不能'"&<
  • 在文本节点内,仅和&<
  • 在 href 值中,需要在 url 中转义的字符(有时这些字符需要双重转义,以便在浏览器取消转义一次后仍会转义它们)
  • 在 CDATA 块中,通常没有(在 HTML 级别)。

最后,除了双重转义的危险之外,转义所有文本的成本是最小的:网络上有一点点额外的处理和一些额外的字节。


答案 2

HTML(现在我们最好说XML)定义了许多所谓的“特殊”字符,这意味着这些字符对浏览器具有特殊意义,而“普通”字符只是意味着它们自己。例如,字符串仅包含“正常”字符,因此它的字面意思是浏览器。字符串 ,包含特殊字符 和 ,对于浏览器,它的意思是:而不仅仅是 。"Hello, World!""Hello, World!""<b>Hello, World!</b>"'<''>''/'typeset string "Hello, World!" in boldtypeset "<b>Hello, World!</b>"

方法可能(我不能确定,因为我不知道它是如何实现的)将任意字符串转换为HTML代码,这将指示浏览器从字面上排版此字符串。例如,whill 返回 HTML 代码,该代码将被浏览器解释为而不是 .如果方法实现正确,则不应关心此方法生成的 HTML 代码的外观。只需在您想要要求浏览器按字面意思排版某些字符串的地方使用它即可。escapeHtml (String)escapeHtml ("<b>Hello, World!</b>")typeset "<b>Hello, World!</b>" normallytypeset string "Hello, World!" in boldescapeHtml (String)