zoukankan      html  css  js  c++  java
  • JSP中使用JSTL,并且解决XSS安全问题

    普通的Java Web项目中使用JSTL来简化JSP, 以及使用<c:out> 标签处理Cross-Site Scripting安全问题。

    1. 下载JSTL必要的jar包
    官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

    下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下,将 tld下的需要引入的 tld 文件复制到 WEB-INF/lib目录下。

    2. 引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    在需要使用JSTL的JSP文件最开始处加入

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. 使用
    Demo项目创建了2个页面,index.jsp 和welcome.jsp,以及用于接受数据的mode ---User.java

    三个文件的code:

    index.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <FORM NAME="form" METHOD="post" ACTION="welcome.jsp">
    <input type="text" name ="name" />
    <input type="text" name="password" />
    <input type="submit" value="submit"/>
    </FORM>
    </body>
    </html>
    index页面通过提交按钮将表单信息传到welcome页面。

    welcome.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <jsp:useBean id="user" scope="request" class="test.bean.User"/>
    <jsp:setProperty name="user" property="name"/>
    <jsp:setProperty name="user" property="password"/>
    <body>
    <%
    String nm = request.getParameter("name");
    String pwd = request.getParameter("password");
    %>

    <%= request.getParameter("name")%>

    <c:out value="${param['name']}"/>

    </html>
    welcome.jsp接收index页面传递过来得方式有两种

    User.java

    public class User {
    private String name;

    private String password;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
    }
    1、User bean接收

    <jsp:useBean id="user" scope="request" class="test.bean.User"/>
    <jsp:setProperty name="user" property="name"/>
    <jsp:setProperty name="user" property="password"/>
    property的值需要和index.jsp中输入框的name值对应。

    2、通过变量接收

    String nm = request.getParameter("name");
    String pwd = request.getParameter("password");
    jsp中嵌套的java code,将request中的参数存到两个变量中(nm, pwd)

    那么如何将index页面传递过来的参数显示呢?
    1、EL表达式

    ${xxx}

    2、<c:out>标签

    直接输出到页面

    <c:out value="${param['name'] }" />
     将值填充到输出框中

    <input type="text" value="<c:out value="<%= nm%>"/>" />
    <input type="text" value="<c:out value="${param['name']}"/>" />
    但是为什么EL表达式中不直接用nm变量?因为${nm}拿到的值为null。

    EL表达式中的内容必须在PageScope、RequestScope、SessionScope、ApplicationScope四个范围之一,才能取到值。

    而nm定义在Java中,属于局部变量。

    3、<jsp:getProperty>标签

    <jsp:getProperty name="user" property="name"/>
    4、<%= 表达式%>

    <%= nm%>
    或者

    <%= request.getParameter("name")%>
    但是<%= 表达式%>和<c:out>这两种输出方式是有区别的,即:输出内容中含html或者js标签时,前者会影响html页面格式或者执行js内容,后者会直接输出,不会影响页面和执行js

    例如:

    输入<script>alert('hello');</script>

    <%= request.getParameter("name")%>, welcome页面会出现弹框

    而<c:out value="${param['name']}">就不会,而是直接输出内容,不执行js。

    因此,JSTL的<c:out>标签可以用来处理Cross-Site Scripting 安全问题。

  • 相关阅读:
    ural1238. Folding(记忆化)
    URAL1410. Crack
    树套树Day1线段树套平衡树bzoj3196
    noipd2t3列队
    NOIP2017D1T3
    uoj279温暖会指引我们前行
    一篇打脸文
    Link-Cut Tree
    重口味费用流
    bzoj1000~1025
  • 原文地址:https://www.cnblogs.com/JAYIT/p/12980972.html
Copyright © 2011-2022 走看看