2-监听器与过滤器

Pasted image 20250321123500

1. 什么是Filter

Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能
首先要了解用户进行网络请求的流程
Pasted image 20250319142152
对请求而言:Listener -> Filter -> Servlet

2. Filter过滤器

2.1. XSS过滤器的简单实现

2.1.1. 创建过滤器

新建一个 Filter 包,然后这里我创建了一个 XssFilter 类,然后实现了 Filter 接口。(这里导入对应的包)
然后重写方法

package com.example.servlet.Filter;

import javax.servlet.*;
import java.io.IOException;

public class XssFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
}

2.1.2. 配置路由

然后配置过滤器到index路由到
@WebFilter(filterName = "xss",value = "/index")

public class XssFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
    }

    @Override
    public void destroy() {
        System.out.println("xss destroy");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("xss init");
    }
}

2.1.3. 测试Filter流程

然后启动网站,发现还没访问 /index 就会初始化 xss init方法
Pasted image 20250319150134
然后访问 /index 触发了 doFilter 方法
Pasted image 20250319150612

2.1.4. 简单实现XSS的过滤

现在我们访问 /index?name=<script>alert(1)</script> 就会弹出提示框
然后我们使用 Filter 过滤器进行过滤

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        String name = request.getParameter("name");
        if (!name.contains("script")) {
            filterChain.doFilter(servletRequest, servletResponse);
        }else {
            System.out.println("XssFilter found attck!");
        }
    }

这段代码的意思是 如果在 name 变量里面发现了 script 那么就会输出 XssFilter found attck! 并且不会执行 DoGet 方法

2.2. 过滤器安全场景

Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考: https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

3. 监听器

Pasted image 20250319142152
根据图片可以知道,这个监听器在过滤器前面

  • 过滤器一般就是过滤代码
  • 监听器就是监听动作(如cookie session的修改)
  • 监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
  • 监听域对象的属性发生修改的事件
  • 监听在事件发生前、发生后做一些必要的处理

3.1. 案例

3.1.1. 新建AdminServlet

Servlet 包里面新建一个 AdminServlet

@WebServlet(name="admin",value = "/admin")
public class AdminServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("AdminServlet init");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("AdminServlert doGet");
        //销毁session
        req.getSession().invalidate();
    }

    @Override
    public void destroy() {

    }
}

3.1.2. 创建监听器

Listen 包里面创建一个 SessionListen

@WebListener("/admin")
public class SessionListen implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Listen Session created");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Listen Session destroyed");
    }
}