//package com.dxhy.common.filter;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.core.annotation.Order;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.*;
//import javax.servlet.http.HttpServletRequest;
//import java.io.IOException;
//import java.util.Enumeration;
//import java.util.Map;
//
///**
// * @ClassName SqlInjectFilter
// * @Description sql防注入过滤器
// * @Author Allen
// * @Date 2023/6/13 14:34
// * @Version 1.0
// */
//@Component
//@Order(0)
//@Slf4j
//public class SqlInjectFilter implements Filter {
//    @Override
//    public void init(FilterConfig filterConfig) throws ServletException {
//        log.info("sql防注入过滤器初始化");
//    }
//
//    @Override
//    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//
//        log.info("sql防注入过滤器执行。。。");
//
//        HttpServletRequest request = (HttpServletRequest) req;
//        // 获得所有请求参数名
//        Enumeration params = request.getParameterNames();
//        StringBuilder sql = new StringBuilder();
//        while (params.hasMoreElements()) {
//            // 得到参数名
//            String name = params.nextElement().toString();
//            // 得到参数对应值
//            String[] value = request.getParameterValues(name);
//            for (int i = 0; i < value.length; i++) {
//                sql.append(value[i]);
//            }
//        }
//        SqlInjectHttpServletRequestWrapper sqlInjectHttpServletRequestWrapper = new SqlInjectHttpServletRequestWrapper(request);
//        if (MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(sqlInjectHttpServletRequestWrapper.getHeader(HttpHeaders.CONTENT_TYPE))) {
//            //只过滤Content-Type为application/json的参数
//            String s = new String(sqlInjectHttpServletRequestWrapper.getInputstrem(), "utf-8");
//            jsonLoop(JSON.parseObject(s),sql);
//        }
//
//        if (sqlValidate(sql.toString())) {
//            log.info("发送请求中的参数中含有非法字符，{}",sql);
//            throw new RuntimeException("您发送请求中的参数中含有非法字符");
//        } else {
//            chain.doFilter(sqlInjectHttpServletRequestWrapper, res);
//        }
//    }
//
//    public static void jsonLoop(Object object,StringBuilder sql) {
//
//        if(object instanceof JSONObject) {
//            JSONObject jsonObject = (JSONObject) object;
//            for (Map.Entry<String, Object> entry: jsonObject.entrySet()) {
//                Object o = entry.getValue();
//                if(o instanceof String) {
//                    sql.append(o);
//                } else {
//                    jsonLoop(o,sql);
//                }
//            }
//        }
//        if(object instanceof JSONArray) {
//            JSONArray jsonArray = (JSONArray) object;
//            for(int i = 0; i < jsonArray.size(); i ++) {
//                jsonLoop(jsonArray.get(i),sql);
//            }
//        }
//    }
//
//    /**
//     * 参数校验
//     * @param str
//     */
//    public static boolean sqlValidate(String str) {
//        str = str.toLowerCase();//统一转为小写
//        String badStr = "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|like";
//        String[] badStrs = badStr.split("\\|");
//        for (int i = 0; i < badStrs.length; i++) {
//            //循环检测，判断在请求参数当中是否包含SQL关键字
//            if (str.indexOf(badStrs[i]) >= 0) {
//                return true;
//            }
//        }
//        return false;
//    }










//
//    /**
//     * 过滤器配置对象
//     */
//    FilterConfig filterConfig = null;
//
//    /**
//     * 是否启用(默认启用)
//     */
//    private boolean enable = true;
//
//
//    /**
//     * 忽略的URL
//     */
//    @Value("${security.sql.excludes}")
//    private String excludes;
//
//
//    /**
//     * 初始化
//     */
//    @Override
//    public void init(FilterConfig filterConfig) throws ServletException {
//        this.filterConfig = filterConfig;
//    }
//
//    /**
//     * 拦截
//     */
//    @Override
//    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
//            throws IOException, ServletException {
//        HttpServletRequest request = (HttpServletRequest) servletRequest;
//
//        // 不启用或者已忽略的URL不拦截
//        if (!enable || isExcludeUrl(request.getServletPath())) {
//            filterChain.doFilter(servletRequest, servletResponse);
//            return;
//        }
//        SqlInjectHttpServletRequestWrapper sqlInjectHttpServletRequestWrapper = new SqlInjectHttpServletRequestWrapper(
//                request);
//        filterChain.doFilter(sqlInjectHttpServletRequestWrapper, servletResponse);
//    }
//
//    /**
//     * 销毁
//     */
//    @Override
//    public void destroy() {
//        this.filterConfig = null;
//    }
//
//    /**
//     * 判断是否为忽略的URL
//     *
//     * @return true-忽略，false-过滤
//     */
//    private boolean isExcludeUrl(String url) {
//        if (excludes == null || excludes.isEmpty()) {
//            return false;
//        }
//        List<String> urls = Arrays.asList(excludes.split(","));
//        return urls.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url)).anyMatch(Matcher::find);
//    }





//}
