zoukankan      html  css  js  c++  java
  • 你的显示方式安全么?JSTL中c:out标签介绍

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

     执行script

      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>

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

  • 相关阅读:
    message:"iconv(): Detected an illegal character in input string"
    VM Mac OS 无法开机
    你的爱 歌词
    大脑结构 | 前脑 | 中脑 | 后脑 | 脑干 | 大脑发育
    【分布计算环境笔记】10 SOA、网格计算、云计算与P2P技术
    【职场Tips】Language in IBM——献给所有即将成为IBMer的童鞋
    【系统工程师的自我修养】sed篇
    【Java学习笔记】如何写一个简单的Web Service
    Unison(双向同步软件)的安装与配置【转】
    发生java.lang.OutOfMemoryError: Direct buffer memory【转】
  • 原文地址:https://www.cnblogs.com/lucky2u/p/3549264.html
Copyright © 2011-2022 走看看