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>

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

  • 相关阅读:
    生成格雷码 转自leetcode
    webstorm注册码 永久有效!!!(亲测有效)
    Myeclipse或者eclipse太卡
    对封装的再次理解(容器)
    几个好的参考的网站
    将json字符串转为json对象,从对象中取需要的数据
    ElementUI学习笔记
    Oracle的case when 和decode
    20190807更新数据相关笔记
    oracle未查找到任何数据问题
  • 原文地址:https://www.cnblogs.com/lucky2u/p/3549264.html
Copyright © 2011-2022 走看看