【代码审计】JAVAWeb基础过滤器

JAVAWeb基础过滤器

0x00 版权声明

JAVA基础系列是笔者学习@炼石星球的笔记,大部分文字描述取自星球内发布的教程文件,仅作学习。

0x01 什么是过滤器、监听器和拦截器

  • 过滤器:在servlet中,过滤器也就是 Filter ,它主要用于过滤字符编码,做一些统 一的业务等等。是使用 javax.servlet.Filter 接口进行实现的。在代码安全中,他常被用于防止XSS,防SQL注入,防任意文件上传等。再配置了Filter之后,它可以统一过滤危险字符,省时省力。
  • 监听器:在servlet中,监听器也就是 Listener ,它主要用于做一些初始化的内容。 是使用 javax.servlet.ServletContextListener 接口进行实现的。如果同时有监听器和过滤器,监听器是在过滤器之前启动。
  • 拦截器:依赖WEB框架,在SrpingMvc中就依赖SpringMVC框架。是属于面向切面变成的一种运用

0x02 过滤器和拦截器的区别

  • 拦截器是基于Java的反射机制的,而过滤器是基于函数回调
  • 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
  • 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
  • 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被 调用一次

0x03 编程实现

第一步,main新建package

接上一篇JAVAWeb基础第一个Servlet,在main.java文件夹右键选择新建package包,导入com.test.filter,在filter文件夹新建FilterTest.class文件,并写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.test.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FilterTest implements Filter {
@Override
public void destroy() {

}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

String requestURI = request.getRequestURI();
if (requestURI.contains("/FirstServlet")){
chain.doFilter(request,response);
}else {
request.getRequestDispatcher("/").forward(request,response);
}
}
@Override
public void init(FilterConfig config) throws ServletException{

}
}

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com/blog/202209251852646.png

首先通过 String requestURI = request.getRequestURI(); 获取URL路径。然后 对路径进行判断,如果路径中包含 /FirstServlet ,则放行。否则就跳转到根路径 下。

第二步,注册过滤器

在web.xml中配置注册过滤器:

1
2
3
4
5
6
7
8
9
10
11
<!--配置过滤器-->
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.test.filter.FilterTest</filter-class>
</filter>
<!--映射过滤器-->
<filter-mapping>
<filter-name>FilterTest</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com/blog/202209251854754.png

第三步,运行项目

点击运行项目,观察结果:

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com/blog/202209251856043.png

可以看到,当访问FirstServlet目录,页面是Servlet页面,当访问不存在的目录,页面显示的是项目根目录。