在JSTL / JSP中,我什么时候必须使用<c:out value= "${myVar}" />,什么时候我可以只说${myVar}



我在JSP代码中一直在做这件事:

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

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

${myVar}

它在没有<c:out>的情况下工作!

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

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

所以,我的问题是,我可以用这个较短的版本替换代码中的<c:out>吗?有什么理由继续使用<c:out>吗?或者有没有地方我可能还需要它?

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

我给你举一个简单的例子,让你明白。如果你开发了一个论坛,有人发布了以下消息,而你没有使用<c:out>来显示此消息,你就会遇到问题:

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

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

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

不真实。只要<%@page pageEncoding="UTF-8" %>就足够了。剩余部分已经全部默认。

自JSP 2.0以来,模板文本中的EL就得到了支持,它与Servlet 2.4(自2003年以来就已经推出了…请随时了解最新情况(齐头并进。因此,当您运行一个支持Servlet2.4的容器(例如Tomcat5.5或更高版本(,并声明web.xml符合Servlet2.4neneneba API时,您将能够在模板文本中使用EL。

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

最新更新