【问题标题】:In JSTL/JSP when do I have to use <c:out value="${myVar}"/> and when can I just say ${myVar}在 JSTL/JSP 中我什么时候必须使用 <c:out value="${myVar}"/> 什么时候可以说 ${myVar}
【发布时间】:2011-09-28 07:42:45
【问题描述】:

我一直在我的 JSP 代码中这样做:

<c:out value="${myVar}"/>

今天我第一次意识到我似乎也可以使用这个较短的版本:

${myVar}

没有&lt;c:out&gt;也可以工作!

也许这是因为我的页面是这样声明的:

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>

那么,我的问题是,我可以用这个更短的版本替换我的代码中的&lt;c:out&gt; 吗?有什么理由继续使用&lt;c:out&gt;?或者有什么地方我可能还需要它?

【问题讨论】:

    标签: java jsp jstl el


    【解决方案1】:

    &lt;c:out&gt; 不仅仅是输出文本。它转义了 HTML 特殊字符。每当您不确定文本不包含以下任何字符时,请使用它 (or ${fn:escapeXml()}):", ', &lt;, &gt;, &amp;。否则,您将遇到无效的 HTML(最好的情况)、损坏的页面或跨站点脚本攻击(最坏的情况)。

    我会给你一个简单的例子,以便你理解。如果你开发了一个论坛,有人发了下面的消息,而你不使用&lt;c:out&gt;来显示这个消息,那你就有问题了:

    <script>while (true) alert("you're a loser");</script>
    

    【讨论】:

    • “宽松”?我想你的意思是“失败者”。
    • 这是否也适用于您不直接将内容输出到页面时(例如:&lt;c:set var="someVar" value="${someVal}"/&gt;)。在这种情况下,${someVal} 是否也应该被转义?还是只需要担心打印到页面时转义(例如:&lt;h1&gt;&lt;c:out value="${someVar}"/&gt;&lt;/h1&gt;
    • 仅在打印到页面时。
    【解决方案2】:

    也许这是因为我的页面是这样声明的:

    <%@ page language="java" contentType="text/html; 
    charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>
    

    不真实。只需&lt;%@page pageEncoding="UTF-8" %&gt; 就足够了。余数已经全部默认了。

    从 JSP 2.0 开始支持模板文本中的 EL,它与 Servlet 2.4 齐头并进(自 2003 年就已经推出......让自己保持最新状态)。因此,当您运行支持 Servlet 2.4 的容器(例如 Tomcat 5.5 或更高版本)并声明了符合 Servlet 2.4 API 的 web.xml,那么您将能够在模板文本中使用 EL。

    但是,您不应使用它来(重新)显示用户控制的输入。因此,不要使用它来(重新)显示(保存)请求标头、请求 cookie、请求 URL、请求参数、请求正文等。这将为XSS attacks 敞开大门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 2013-10-23
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2016-10-22
      • 2020-03-06
      相关资源
      最近更新 更多