在开发中经常要在前台的页面中展示从后台传过来的变量值,一种方式是通过在JSP中掺杂入JAVA代码的方式,当然还可以结合EL表达式用JSTL等标签库的方式来显示。我经常使用的就是这两种显示方式,本以为拥有同样显示结果的方式没什么大不同,但是在近期了解跨站攻击漏洞(XSS)后发现这之间的显示方式是有多大的差距。
1.首先通过一个demo来进行测试
(1)这段代码是controller中的一个方法,里面有个str变量是含有js脚本的一段文本,我通过把它放在request对象里,来向前台展示的方式对此进行测试。
1 @RequestMapping(value = "/welcome", method = RequestMethod.GET) 2 public String registPost(ModelMap modelMap) { 3 String str="<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>"; 4 modelMap.put("str", str); 5 return "/welcome"; 6 }
(2)这段代码是将从controller中传来的str变量通过不同的方式来展现
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="utf-8"%> 3 <%@ include file="/WEB-INF/tagInclude.inc.jsp"%> 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 5 <html> 6 <head> 7 <title>welcome page</title> 8 <meta http-equiv="pragma" content="no-cache"> 9 <meta http-equiv="cache-control" content="no-cache"> 10 </head> 11 <body> 12 <ol> 13 <li>不使用c:out标签:${str}</li> 14 <li>使用c:out标签,不设置default值:<c:out value="${str}"></c:out></li> 15 <li>使用c:out标签,设置default值:<c:out value="${str}" 16 default="defaultName"></c:out></li> 17 <li>使用c:out标签,escapeXml=false:<c:out value="${str}" 18 escapeXml="false"></c:out></li> 19 <li>使用c:out标签,escapeXml=true:<c:out value="${str}" 20 escapeXml="true"></c:out></li> 21 <li>不使用JSTL,嵌入JAVA代码直接显示:<%=request.getAttribute("str")%></li> 22 </ol> 23 24 </body> 25 </html>
(3)接下来是看效果的时候了
页面弹出了三个下面的script的alert窗口,文字上写的是js from controller。
JSP页面接收的str又会显示什么内容呢,看看下面内容:
- 不使用c:out标签:
text from controller
- 使用c:out标签,不设置default值:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
- 使用c:out标签,设置default值:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
- 使用c:out标签,escapeXml=false:
text from controller
- 使用c:out标签,escapeXml=true:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
- 不使用JSTL,嵌入JAVA代码直接显示:
text from controller
2.总结
上面的例子很具有说服性吧,在此总结一下:
- 不适用jstl标签直接显示的,效果相当于<c:out value="${str}" escapseXml="false" default=""></c:out>
- 使用jstl的,若为空,则显示空字符串,否则显示全部
- 使用JSTL的,escapseXml为true的将对要显示的字符串进行解析,而将所有的内容当做文本内容显示出来,而当它为false的时候,会将其认为是html,执行script、显示style。
建议:在显示的时候防止xss漏洞的情况下,使用<c:out value="${str}" escasexml="true" default=""/></c:out>
有任何意见和建议请指出,谢谢~~