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

时间:2022-11-26 08:15:51

  在开发中经常要在前台的页面中展示从后台传过来的变量值,一种方式是通过在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。

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

  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>

 

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