高位漏洞修改
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