• 防止XSS 攻击集成springboot


    1.配置相关数据

    在配置文件中配置

    # 防止XSS攻击
    xss: 
      # 过滤开关
      enabled: true
      # 排除链接(多个用逗号分隔)
      excludes: /system/notice/*
      # 匹配链接
      urlPatterns: /system/*,/monitor/*,/tool/*

    2.编写Filter配置类

    import java.util.Map;
    import javax.servlet.DispatcherType;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.google.common.collect.Maps;
    import com.ruoyi.common.utils.StringUtils;
    import com.ruoyi.common.xss.XssFilter;
    
    /**
     * Filter配置
     *
     * @author xxx
     */
    @Configuration
    public class FilterConfig
    {
        @Value("${xss.enabled}")
        private String enabled;
    
        @Value("${xss.excludes}")
        private String excludes;
    
        @Value("${xss.urlPatterns}")
        private String urlPatterns;
    
        @SuppressWarnings({ "rawtypes", "unchecked" })
        @Bean
        public FilterRegistrationBean xssFilterRegistration()
        {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            //
            registration.setDispatcherTypes(DispatcherType.REQUEST);
            //过滤器类(继承Filter)
            registration.setFilter(new XssFilter());
            //
            registration.addUrlPatterns(StringUtils.split(urlPatterns, ","));
            //
            registration.setName("xssFilter");
            //
            registration.setOrder(Integer.MAX_VALUE);
            Map<String, String> initParameters = Maps.newHashMap();
            initParameters.put("excludes", excludes);
            initParameters.put("enabled", enabled);
            //Filter 初始化参数
            registration.setInitParameters(initParameters);
            return registration;
        }
    }

    3.编写过滤器

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.ruoyi.common.utils.StringUtils;
    
    /**
     * 防止XSS攻击的过滤器
     * 
     * @author xxx
     */
    public class XssFilter implements Filter
    {
        /**
         * 排除链接
         */
        public List<String> excludes = new ArrayList<>();
    
        /**
         * xss过滤开关
         */
        public boolean enabled = false;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException
        {
            String tempExcludes = filterConfig.getInitParameter("excludes");
            String tempEnabled = filterConfig.getInitParameter("enabled");
            if (StringUtils.isNotEmpty(tempExcludes))
            {
                String[] url = tempExcludes.split(",");
                for (int i = 0; url != null && i < url.length; i++)
                {
                    excludes.add(url[i]);
                }
            }
            if (StringUtils.isNotEmpty(tempEnabled))
            {
                enabled = Boolean.valueOf(tempEnabled);
            }
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException
        {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            if (handleExcludeURL(req, resp))
            {
                chain.doFilter(request, response);
                return;
            }
            XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
            chain.doFilter(xssRequest, response);
        }
    
        private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
        {
            if (!enabled)
            {
                return true;
            }
            if (excludes == null || excludes.isEmpty())
            {
                return false;
            }
            String url = request.getServletPath();
            for (String pattern : excludes)
            {
                Pattern p = Pattern.compile("^" + pattern);
                Matcher m = p.matcher(url);
                if (m.find())
                {
                    return true;
                }
            }
            return false;
        }
    
        @Override
        public void destroy()
        {
    
        }
    }

    3.XssHttpServletRequestWrapper 类

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import org.jsoup.Jsoup;
    import org.jsoup.safety.Whitelist;
    
    /**
     * XSS过滤处理
     * 
     * @author xxx
     */
    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
    {
        /**
         * @param request
         */
        public XssHttpServletRequestWrapper(HttpServletRequest request)
        {
            super(request);
        }
    
        @Override
        public String[] getParameterValues(String name)
        {
            String[] values = super.getParameterValues(name);
            if (values != null)
            {
                int length = values.length;
                String[] escapseValues = new String[length];
                for (int i = 0; i < length; i++)
                {
                    // 防xss攻击和过滤前后空格
                    escapseValues[i] = Jsoup.clean(values[i], Whitelist.relaxed()).trim();
                }
                return escapseValues;
            }
            return super.getParameterValues(name);
        }
    }

    到此就完成了!!

  • 相关阅读:
    Go语言核心36讲(Go语言实战与应用九)学习笔记
    Go语言核心36讲(Go语言实战与应用六)学习笔记
    Go语言核心36讲(Go语言实战与应用二十一)学习笔记
    Go语言核心36讲(Go语言实战与应用十二)学习笔记
    Go语言核心36讲(Go语言实战与应用七)学习笔记
    Go语言核心36讲(Go语言实战与应用二十)学习笔记
    Go语言核心36讲(Go语言实战与应用二十四)学习笔记
    .NET 云原生架构师训练营(对象过程建模)学习笔记
    Go语言核心36讲(Go语言实战与应用二十二)学习笔记
    .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)学习笔记
  • 原文地址:https://www.cnblogs.com/deityjian/p/12518369.html
Copyright © 2020-2023  润新知