14

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

StringEscapeUtils.escapeHtml(stringBody);

我从 api doc 知道 escapeHtml 做了什么。这是给出的示例:-

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

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

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

4

4 回答 4

18

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

  • 也许最初的程序员确信在某些地方字符串没有特殊字符(但是,在我看来,这将是不好的编程习惯;为了防止将来发生变化,转义字符串的成本很低)
  • 该字符串已经在代码中的那一点进行了转义。您绝对不想两次转义字符串;用户最终会看到转义序列而不是预期的文本。
  • 该字符串是实际的 html 本身。您不想转义 html;你想让浏览器处理它!

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

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

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

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

请注意,有几种情况下文本可以出现在 html 文档中,并且它们对转义有不同的要求。应转义以下内容:

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

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

于 2013-02-08T04:42:38.057 回答
3

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

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

于 2013-02-08T04:50:54.840 回答
2

当 html 或 xml 有可能与页面生成的 html(读取 jsp)一起被解释时,您必须转义它。

这个好问题也解释了它。

于 2013-02-08T04:41:33.297 回答
1

根据我的经验,所有字符串都应该在显示在页面上之前从 Html 中转义。我们当前的项目是关于管理 Active Directory 中的所有组织单元,这些单元可以包含任何特殊字符(包括 Html 字符)。在页面上显示时,您最终可能会使用以下代码来显示一条名为User <Marketing>

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a>

页面渲染后会变成

<a href="viewDetail.do"> User <Marketing> </a>

它实际上User在页面上显示为超链接。

但是,如果您在发送到页面之前转义 Html 值

request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>"));

页面渲染后会变成

 <a href="viewDetail.do"> User &lt;Marketing&gt; </a>

在 JSP 页面上正确显示

很快,您使用转义 Html 字符来防止特殊输入。如果输入包含 Html 字符,您的页面在渲染过程中会出现错误

于 2013-02-08T04:53:05.923 回答