zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JSP中使用JSTL,并且解决XSS安全问题

JSP安全 解决 并且 XSS JSTL 问题 使用
2023-09-27 14:23:13 时间

普通的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 安全问题。