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

2022-09-03 04:48:39

我一直在我的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>


答案 1

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

我给你一个简单的例子,这样你就能理解。如果您开发了一个论坛,并且有人发布了以下消息,并且您不用于显示此消息,则会遇到问题:<c:out>

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

答案 2

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

<%@ 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 API运行支持Servlet 2.4的容器(例如Tomcat 5.5或更高版本)时,您将能够在模板文本中使用EL。web.xml

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