springBoot集成jsoup解决安全漏洞之XSS注入攻击问题

 更新时间:2025年06月24日 09:55:07   作者:yololee_  
这篇文章主要介绍了springBoot集成jsoup解决安全漏洞之XSS注入攻击问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

跨站点脚本编制

  • 风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。
  • 原因:未对用户输入正确执行危险字符清理
  • 固定值:查看危险字符注入的可能解决方案

一、依赖

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>

二、自定义过滤器

XSS过滤处理逻辑

package com.yolo.springboot.kaptcha.filter;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * XSS过滤处理
 */
@Slf4j
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    /**
     * 获取头部参数
     * @param v 参数值
     */
    @Override
    public String getHeader(String v) {
        String header = super.getHeader(v);
        if (header == null || "".equals(header)) {
            return header;
        }
        return Jsoup.clean(super.getHeader(v), Whitelist.relaxed());
    }

    /**
     * 获取参数
     * @param v 参数值
     */
    @Override
    public String getParameter(String v) {
        String param = super.getParameter(v);
        if (param == null || "".equals(param)) {
            return param;
        }
        return Jsoup.clean(super.getParameter(v), Whitelist.relaxed());
    }

    /**
     * 获取参数值
     * @param v 参数值
     */
    @Override
    public String[] getParameterValues(String v) {
        String[] values = super.getParameterValues(v);
        if (values == null) {
            return values;
        }
        int length = values.length;
        String[] resultValues = new String[length];
        for (int i = 0; i < length; i++) {
            // 过滤特殊字符
            resultValues[i] = Jsoup.clean(values[i], Whitelist.relaxed()).trim();
            if (!(resultValues[i]).equals(values[i])) {
                log.debug("XSS过滤器 => 过滤前:{} => 过滤后:{}", values[i], resultValues[i]);
            }
        }
        return resultValues;
    }
}

防止XSS攻击的过滤器

package com.yolo.springboot.kaptcha.filter;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ClassName XssFilter
 * @Description 防止XSS攻击的过滤器
 * @Author hl
 * @Date 2022/12/7 10:07
 * @Version 1.0
 */
public class XssFilter implements Filter {

    /**
     * 排除链接
     */
    public List<String> noFilterUrls = new ArrayList<>();

    /**
     * xss过滤开关
     */
    public boolean enabled = true;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从过滤器配置中获取initParams参数
        String noFilterUrl = filterConfig.getInitParameter("noFilterUrl");
        // 将排除的URL放入成员变量noFilterUrls中
        if (StringUtils.isNotBlank(noFilterUrl)) {
            noFilterUrls = new ArrayList<>(Arrays.asList(noFilterUrl.split(",")));
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        if (!enabled || handleExcludeURL(req)) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(req);
        filterChain.doFilter(xssRequest, servletResponse);
    }

    /**
     * 判断是否为忽略的URL
     * @return true-忽略,false-过滤
     */
    private boolean handleExcludeURL(HttpServletRequest request) {
        if (noFilterUrls == null || noFilterUrls.isEmpty()) {
            return false;
        }

        String url = request.getServletPath();
//        return excludes.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url))
//                .anyMatch(Matcher::find);
        for (String pattern : noFilterUrls) {
            Pattern p = Pattern.compile("^" + pattern);
            Matcher m = p.matcher(url);
            if (m.find()) {
                return true;
            }
        }
        return false;
    }

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

注册过滤器

package com.yolo.springboot.kaptcha.config;

import com.yolo.springboot.kaptcha.filter.XssFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean<?> xssFilterRegistration() {
        FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
        // 将过滤器配置到FilterRegistrationBean对象中
        registration.setFilter(new XssFilter());
        // 给过滤器取名
        registration.setName("xssFilter");
        // 设置过滤器优先级,该值越小越优先被执行
        registration.setOrder(0);
        List<String> urlPatterns = new ArrayList<>();
        urlPatterns.add("/*");
        //这里需要填写排除上传文件的接口
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("noFilterUrl", "/login,/logout,/images/*");
        // 设置initParams参数
        registration.setInitParameters(paramMap);
        // 设置urlPatterns参数
        registration.setUrlPatterns(urlPatterns);
        return registration;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Grpc实例创建负载均衡详解

    Java Grpc实例创建负载均衡详解

    这篇文章主要介绍了Java Grpc实例创建负载均衡详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 后端java压缩图片超详细图文教程

    后端java压缩图片超详细图文教程

    这篇文章主要给大家介绍了关于后端java压缩图片的相关资料,片压缩是一种广泛采用的技术,它不仅能显著减小文件大小,释放更多存储空间,还能提升图片加载速度,避免长时间等待,需要的朋友可以参考下
    2024-04-04
  • Java生成随机姓名、性别和年龄的实现示例

    Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot中Formatter和Converter用法和区别小结

    SpringBoot中Formatter和Converter用法和区别小结

    本文主要介绍了SpringBoot中Formatter和Converter用法和区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • SpringBoot3实现webclient的通用方法详解

    SpringBoot3实现webclient的通用方法详解

    Spring Boot WebClient 是 Spring Framework 5 中引入的一个新的响应式 Web 客户端,用于异步和响应式地与外部服务进行通信,下面我们就来看看SpringBoot3实现webclient的通用方法吧
    2024-04-04
  • Java实现MySQL数据实时同步至Elasticsearch的方法详解

    Java实现MySQL数据实时同步至Elasticsearch的方法详解

    MySQL擅长事务处理,而Elasticsearch(ES)则专注于搜索与分析,将MySQL数据实时同步到ES,可以充分发挥两者的优势,下面我们就来看看如何使用Java实现这一功能吧
    2025-03-03
  • SpringBoot实现配置文件的替换

    SpringBoot实现配置文件的替换

    这篇文章主要介绍了SpringBoot实现配置文件的替换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中hasNextInt()的使用场景和注意事项

    Java中hasNextInt()的使用场景和注意事项

    hasNextInt()方法是判断控制台接收是否为整型数字,而不是接收数据,这篇文章主要介绍了Java中hasNextInt()的使用场景和注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-05-05
  • Spring Boot 拦截器帮助解锁5种常用场景(推荐)

    Spring Boot 拦截器帮助解锁5种常用场景(推荐)

    在SpringBoot中,拦截器用于在请求处理前后插入自定义逻辑,实现权限校验、日志记录、性能监控等功能,本文给大家介绍Spring Boot 拦截器帮助解锁5大实用场景,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • ClassLoader双亲委派模式作用详解

    ClassLoader双亲委派模式作用详解

    这篇文章主要为大家介绍了ClassLoader双亲委派模式作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论