我希望为我提供一套明确的指导方针或处理逃避字符串的裁决。我用来转义字符串的是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%>"
)。
答案 0 :(得分:16)
你只需要在它可能受到伤害的地方完全逃脱它。在这种特殊情况下,它在视图中。当用户控制的HTML在视图中的所有HTML中进行内联时,可能会受到损害。这是XSS的来源。
在设计良好的JSP页面中(读取:没有 scriptlets),JSTL为您提供<c:out>
标记和fn:escapeXml()
函数来转义HTML / XML
<c:out value="${param.foo}" />
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
答案 1 :(得分:2)
对于你的两个问题:
1)出于显示目的而转义字符串 - 我认为这是一个视图问题。如果您将JSP用作视图,那么您的JSP可以处理此问题。
3)来自模型/业务逻辑层的错误消息不应包含换行符等格式。让您的视图确定如何格式化错误消息。使用HTML,例如,使用具有适当宽度样式的div标签可以消除对br标签的需要。
答案 2 :(得分:2)
我可能不会传递一个String对象,而只是将一个错误对象传递给视图,让jsp做任何想做的事情
在控制器中:
errorObj.name = "invalid login";
errorObj.description = "try again";
在视图中:
<c:out value="${errorObj.name}" /><br /><c:out value="${errorObj.description}" />
与您的问题并不真正相关,但无论登录错误到底是什么,使用“无效登录尝试”等消息也是一种很好的做法。您提供的消息“无效的用户名”让有意图攻击您帐户的人知道他们是否拥有一个好的用户名,然后他们可以用来攻击密码。如果这是公开的,这可能是一个很小但非常真实的问题。