高位漏洞修改
							parent
							
								
									2a1078a9ae
								
							
						
					
					
						commit
						bce113666c
					
				@ -0,0 +1,109 @@
 | 
			
		||||
package com.fuint.common.filter;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.alipay.api.internal.util.file.Charsets;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.ReadListener;
 | 
			
		||||
import javax.servlet.ServletInputStream;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletRequestWrapper;
 | 
			
		||||
import java.io.*;
 | 
			
		||||
import java.util.Enumeration;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p> @Title MyRequestWrapper
 | 
			
		||||
 * <p> @Description 用于过滤器中获取POST请求参数
 | 
			
		||||
 *
 | 
			
		||||
 * @author zhj
 | 
			
		||||
 * @date 2021/10/28 9:52
 | 
			
		||||
 */
 | 
			
		||||
public class MyRequestWrapper extends HttpServletRequestWrapper {
 | 
			
		||||
    private String body;
 | 
			
		||||
    public MyRequestWrapper(HttpServletRequest request) throws IOException {
 | 
			
		||||
        super(request);
 | 
			
		||||
        StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
        BufferedReader bufferedReader = null;
 | 
			
		||||
        try {
 | 
			
		||||
            InputStream inputStream = request.getInputStream();
 | 
			
		||||
            if (inputStream != null) {
 | 
			
		||||
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
 | 
			
		||||
                char[] charBuffer = new char[128];
 | 
			
		||||
                int bytesRead = -1;
 | 
			
		||||
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
 | 
			
		||||
                    stringBuilder.append(charBuffer, 0, bytesRead);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                stringBuilder.append("");
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException ex) {
 | 
			
		||||
            throw ex;
 | 
			
		||||
        } finally {
 | 
			
		||||
            if (bufferedReader != null) {
 | 
			
		||||
                try {
 | 
			
		||||
                    bufferedReader.close();
 | 
			
		||||
                } catch (IOException ex) {
 | 
			
		||||
                    throw ex;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        body = stringBuilder.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ServletInputStream getInputStream() throws IOException {
 | 
			
		||||
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));
 | 
			
		||||
        ServletInputStream servletInputStream = new ServletInputStream() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isFinished() {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isReady() {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void setReadListener(ReadListener readListener) {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public int read() {
 | 
			
		||||
                return byteArrayInputStream.read();
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        return servletInputStream;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public BufferedReader getReader() throws IOException {
 | 
			
		||||
        return new BufferedReader(new InputStreamReader(this.getInputStream(), Charsets.UTF_8));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getBody() {
 | 
			
		||||
        return this.body;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getParameter(String name) {
 | 
			
		||||
        return super.getParameter(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<String, String[]> getParameterMap() {
 | 
			
		||||
        return super.getParameterMap();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Enumeration<String> getParameterNames() {
 | 
			
		||||
        return super.getParameterNames();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String[] getParameterValues(String name) {
 | 
			
		||||
        return super.getParameterValues(name);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,101 @@
 | 
			
		||||
package com.fuint.common.filter;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.alibaba.fastjson2.JSONObject;
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
import com.fuint.framework.exception.BusinessRuntimeException;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import javax.servlet.annotation.WebFilter;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.TreeMap;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@WebFilter(filterName = "CharsetFilter",urlPatterns = "/*")
 | 
			
		||||
public class SpecialCharFilter implements Filter {
 | 
			
		||||
 | 
			
		||||
    private static final String SQL_REGX = "[\\\\^$*+?{}()=&;%+\\[\\].|]";
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException, IOException {
 | 
			
		||||
        HttpServletRequest req = (HttpServletRequest) servletRequest;
 | 
			
		||||
 | 
			
		||||
        // 防止流读取一次后就没有了, 所以需要将流继续写出去
 | 
			
		||||
        MyRequestWrapper requestWrapper = new MyRequestWrapper(req);
 | 
			
		||||
 | 
			
		||||
        // 获取请求参数
 | 
			
		||||
        Map<String, Object> paramsMaps = new TreeMap<>();
 | 
			
		||||
        if ("POST".equals(req.getMethod().toUpperCase())) {
 | 
			
		||||
            String body = requestWrapper.getBody();
 | 
			
		||||
            paramsMaps = JSONObject.parseObject(body, TreeMap.class);
 | 
			
		||||
        } else {
 | 
			
		||||
            Map<String, String[]> parameterMap = requestWrapper.getParameterMap();
 | 
			
		||||
            Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
 | 
			
		||||
            for (Map.Entry<String, String[]> next : entries) {
 | 
			
		||||
                paramsMaps.put(next.getKey(), next.getValue()[0]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 校验SQL注入
 | 
			
		||||
         if (ObjectUtil.isNotEmpty(paramsMaps)) {
 | 
			
		||||
             for (Object o : paramsMaps.entrySet()) {
 | 
			
		||||
                 Map.Entry entry = (Map.Entry) o;
 | 
			
		||||
                 Object value = entry.getValue();
 | 
			
		||||
                 if (value != null) {
 | 
			
		||||
                     boolean isValid = checkSqlInject(value.toString(), servletResponse);
 | 
			
		||||
                     if (!isValid) {
 | 
			
		||||
                         return;
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
        chain.doFilter(requestWrapper, servletResponse);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //获取request请求body中参数
 | 
			
		||||
    public static String getBodyString(BufferedReader br) {
 | 
			
		||||
        String inputLine;
 | 
			
		||||
        String str = "";
 | 
			
		||||
        try {
 | 
			
		||||
            while ((inputLine = br.readLine()) != null) {
 | 
			
		||||
                str += inputLine;
 | 
			
		||||
            }
 | 
			
		||||
            br.close();
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            System.out.println("IOException: " + e);
 | 
			
		||||
        }
 | 
			
		||||
        return str;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 检查SQL注入
 | 
			
		||||
     *
 | 
			
		||||
     * @param value           参数值
 | 
			
		||||
     * @param servletResponse 相应实例
 | 
			
		||||
     * @throws IOException      IO异常
 | 
			
		||||
     */
 | 
			
		||||
    private boolean checkSqlInject(String value, ServletResponse servletResponse) throws IOException {
 | 
			
		||||
        if (null != value) {
 | 
			
		||||
            String output = value.replaceAll(SQL_REGX, "");
 | 
			
		||||
            if (output.length()<value.length()) {
 | 
			
		||||
               return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue