我在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>
?还是有些地方我可能还需要它?
答案 0 :(得分:25)
<c:out>
不仅仅是输出文字。它逃脱了HTML特殊字符。每当您不完全确定文本不包含任何这些字符时,请使用它(or ${fn:escapeXml()}
):", ', <, >, &
。否则,您将拥有无效的HTML(在最好的情况下),页面损坏或跨站点脚本攻击(在最坏的情况下)。
我会给你一个简单的例子让你理解。如果您开发了论坛,并且有人发布了以下消息,并且您没有使用<c:out>
来显示此消息,那么您将遇到问题:
<script>while (true) alert("you're a loser");</script>
答案 1 :(得分:7)
也许这是因为我的页面声明如下:
<%@ 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年以来已经出版)保持同步......让自己保持最新状态。因此,当您运行支持Servlet 2.4的容器(例如Tomcat 5.5或更新版本)并使用web.xml
声明符合Servlet 2.4 API时,您就可以在模板文本中使用EL。
但是,您不应该使用它来(重新)显示用户控制的输入。因此,不要使用它来(重新)显示(保存)请求标头,请求cookie,请求URL,请求参数,请求主体等。这将为XSS attacks打开门。