我应该在哪里转义HTML字符串,JSP页面或Servlet?

2022-09-03 01:53:00

我希望为我提供一套明确的准则或规则来处理转义字符串。我用来转义字符串的是apache commons-lang-x.x.jar库。具体来说就是方法。StringEscapeUtils.escapeHtml(String toEscape)

我需要知道:

(1) 在 JSP 页面还是在 Servlet 中转义字符串更好?

(2) 你推荐什么 StringEscapeUtils.escapeHtml(..) 或 <c:out> 来自 JSTL

(3)处理多行字符串,这样更好,直接在字符串中使用<br>,或者\n和nl2br()方法:

String strError = "Invalid username.\nPlease try again.";

String strError = "Invalid username.<br>Please try again.";

(4)我如何转义接收通配符的字符串,例如:

String strError = "Invalid user [%s].<br>Please specify another user."

(5)由于javascript转义字符是不同的。我应该用什么来转义要在JSP页面的javascript部分内呈现的Java字符串(例如)。var name = "<%=javaStringHoldingName%>"


答案 1

你只需要在它可能伤害的地方逃离它。在这种特殊情况下,它位于视图中。当用户控制的 HTML 在视图中的所有 HTML 中内联时,它可能会受到损害。这是 XSS 的源代码。

在一个设计良好的JSP页面(阅读:没有脚本,JSTL为您提供了转义HTML / XML的标记和函数。<c:out>fn:escapeXml()

<c:out value="${param.foo}" />
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />

答案 2

对于您的两个问题:

1)出于显示目的转义字符串 - 我认为这是一个视图问题。如果你使用 JSP 作为视图,你的 JSP 可以处理这个问题。

3)来自模型/业务逻辑层的错误消息不应包含换行符等格式。让您的视图确定如何设置错误消息的格式。例如,使用具有适当宽度样式的 div 标记可以消除对 br 标记的需求。