【问题标题】:Where should I escape HTML strings, JSP page or Servlets? [duplicate]我应该在哪里转义 HTML 字符串、JSP 页面或 Servlet? [复制]
【发布时间】:2011-06-24 07:52:01
【问题描述】:

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

我需要知道:

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

(2) 你对 JSTL 中的 StringEscapeUtils.escapeHtml(..) 或 有什么推荐

(3)处理多行字符串,哪个更好,直接在字符串中使用
,或者\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%>")。

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    你只需要在它可能造成伤害的地方准确地逃脱它。在这种特殊情况下,它在视图中。当用户控制的 HTML 在视图中的所有 HTML 中内联时,它可能会造成损害。这是 XSS 的来源。

    在精心设计的 JSP 页面中(阅读:no scriptlets),JSTL 为您提供了 <c:out> 标记和 fn:escapeXml() 函数来转义 HTML/XML。

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

    【讨论】:

    • 如果我有一个模板字符串,例如“无效范围 [%s]。
      应该只包含字母数字。”。假设值为“1..,因为它旨在分两行显示。
    • 在基本 JSP 中,您通常使用 JSTL &lt;fmt:message&gt;。或者,当您在 JSP 之上使用(MVC)框架时,如 Spring、JSF 等,它们都有自己的消息格式标签。另请参阅我今天偶然回答的这个相关问题:stackoverflow.com/questions/4961558/…
    • 只是让你知道,它也可以使用在 jsp 中打印出来的StringEscapeUtils.escapeHtml("lala");
    • @Vince:当然它会起作用,它是否是 正确 方式是第二个大问题。另请参阅 stackoverflow.com/questions/3177733/… 尽可能不要使用 scriptlets
    【解决方案2】:

    对于你的两个问题:

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

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

    【讨论】:

    • 你能编辑你的答案,给我一个关于第三点的例子吗?顺便说一句,第二点在哪里 :) 请阅读第一个答案的评论部分中的示例以响应 BalusC
    【解决方案3】:

    我可能不会传递一个字符串对象,而只是将一个错误对象传递给视图,让 jsp 为所欲为

    在控制器中:

    errorObj.name = "invalid login";
    errorObj.description = "try again";
    

    在视图中:

    <c:out value="${errorObj.name}" /><br /><c:out value="${errorObj.description}" />
    

    与您的问题无关,但无论登录错误究竟是什么,使用“无效登录尝试”之类的消息也是一个好习惯。您提供的消息“无效的用户名”让打算入侵您帐户的人知道他们是否有一个好的用户名,然后可以使用该用户名来攻击密码。如果这被公开曝光,这可能是一个很小但非常现实的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2021-06-17
      相关资源
      最近更新 更多