当我需要转义Html字符串?

时间:2013-02-08 04:38:45

标签: java escaping stringescapeutils

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

StringEscapeUtils.escapeHtml(stringBody);

我从api doc知道escapeHtml的作用。给出了一个例子: -

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

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

但是我没有得到原因,何时需要,如果我们发送字符串体而不转义html会发生什么?如果我们在将它发送到浏览器之前不做escapeHtml,费用是多少

4 个答案:

答案 0 :(得分:10)

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

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

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

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

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

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

请注意,有几种上下文可以在html文档中显示文本,并且它们具有单独的转义要求。在属性值中,您需要转义引号和&符号(但不是<)。您必须转义在文档的字符集中没有表示的字符(如果您使用的是UTF-8,则不太可能,但情况并非总是如此)。在文本节点中,只需要转义&<。在href值中,必须转义需要在URL中转义的字符(有时会双重转义,因此在浏览器取消它们一次之后它们仍会被转义)。在CDATA块中,通常不应转义任何内容(在HTML级别)。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

这个好question也解释了它。

答案 3 :(得分: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字符,则在呈现期间页面将显示错误