首页 > Web开发 > 详细

你的显示方式安全么?--JSTL中c:out标签介绍

时间:2014-02-15 02:32:38      阅读:452      评论:0      收藏:0      [点我收藏+]

  在开发中经常要在前台的页面中展示从后台传过来的变量值,一种方式是通过在JSP中掺杂入JAVA代码的方式,当然还可以结合EL表达式用JSTL等标签库的方式来显示。我经常使用的就是这两种显示方式,本以为拥有同样显示结果的方式没什么大不同,但是在近期了解跨站攻击漏洞(XSS)后发现这之间的显示方式是有多大的差距。

1.首先通过一个demo来进行测试

(1)这段代码是controller中的一个方法,里面有个str变量是含有js脚本的一段文本,我通过把它放在request对象里,来向前台展示的方式对此进行测试。

bubuko.com,布布扣
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     }
bubuko.com,布布扣

 

 (2)这段代码是将从controller中传来的str变量通过不同的方式来展现

bubuko.com,布布扣
 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>
bubuko.com,布布扣

 (3)接下来是看效果的时候了

  页面弹出了三个下面的script的alert窗口,文字上写的是js from controller。

 bubuko.com,布布扣

  JSP页面接收的str又会显示什么内容呢,看看下面内容:

  1. 不使用c:out标签:

    text from controller

  2. 使用c:out标签,不设置default值:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
  3. 使用c:out标签,设置default值:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
  4. 使用c:out标签,escapeXml=false:

    text from controller

  5. 使用c:out标签,escapeXml=true:<h4 style=‘color:red;‘ ><script>alert(‘js from controller‘);</script>text from controller</h4>
  6. 不使用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>

 

有任何意见和建议请指出,谢谢~~

你的显示方式安全么?--JSTL中c:out标签介绍

原文:http://www.cnblogs.com/lucky2u/p/3549264.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!