|
@ -0,0 +1,119 @@
|
|
|
package com.yihu.iot.interceptor;
|
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletRequestWrapper;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
/**
|
|
|
* Created by yeshijie on 2020/9/1.
|
|
|
*/
|
|
|
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
|
|
private static String key = "and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+";
|
|
|
private static Set<String> notAllowedKeyWords = new HashSet<String>(0);
|
|
|
private static String replacedString="INVALID";
|
|
|
static {
|
|
|
String keyStr[] = key.split("\\|");
|
|
|
for (String str : keyStr) {
|
|
|
notAllowedKeyWords.add(str);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private String currentUrl;
|
|
|
|
|
|
public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
|
|
|
super(servletRequest);
|
|
|
currentUrl = servletRequest.getRequestURI();
|
|
|
}
|
|
|
|
|
|
|
|
|
/**覆盖getParameter方法,将参数名和参数值都做xss过滤。
|
|
|
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
|
|
|
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
|
|
|
*/
|
|
|
@Override
|
|
|
public String getParameter(String parameter) {
|
|
|
String value = super.getParameter(parameter);
|
|
|
if (value == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return cleanXSS(value);
|
|
|
}
|
|
|
@Override
|
|
|
public String[] getParameterValues(String parameter) {
|
|
|
String[] values = super.getParameterValues(parameter);
|
|
|
if (values == null) {
|
|
|
return null;
|
|
|
}
|
|
|
int count = values.length;
|
|
|
String[] encodedValues = new String[count];
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
encodedValues[i] = cleanXSS(values[i]);
|
|
|
}
|
|
|
return encodedValues;
|
|
|
}
|
|
|
@Override
|
|
|
public Map<String, String[]> getParameterMap(){
|
|
|
Map<String, String[]> values=super.getParameterMap();
|
|
|
if (values == null) {
|
|
|
return null;
|
|
|
}
|
|
|
Map<String, String[]> result=new HashMap<>();
|
|
|
for(String key:values.keySet()){
|
|
|
String encodedKey=cleanXSS(key);
|
|
|
int count=values.get(key).length;
|
|
|
String[] encodedValues = new String[count];
|
|
|
for (int i = 0; i < count; i++){
|
|
|
encodedValues[i]=cleanXSS(values.get(key)[i]);
|
|
|
}
|
|
|
result.put(encodedKey,encodedValues);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
/**
|
|
|
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。
|
|
|
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取
|
|
|
* getHeaderNames 也可能需要覆盖
|
|
|
*/
|
|
|
@Override
|
|
|
public String getHeader(String name) {
|
|
|
String value = super.getHeader(name);
|
|
|
if (value == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return cleanXSS(value);
|
|
|
}
|
|
|
|
|
|
private String cleanXSS(String valueP) {
|
|
|
// You'll need to remove the spaces from the html entities below
|
|
|
String value = valueP.replaceAll("<", "<").replaceAll(">", ">");
|
|
|
value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
|
|
|
value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
|
|
|
value = value.replaceAll("'", "& #39;");
|
|
|
value = value.replaceAll("eval\\((.*)\\)", "");
|
|
|
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
|
|
|
value = value.replaceAll("script", "");
|
|
|
value = cleanSqlKeyWords(value);
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
private String cleanSqlKeyWords(String value) {
|
|
|
String paramValue = value;
|
|
|
for (String keyword : notAllowedKeyWords) {
|
|
|
if (paramValue.length() > keyword.length() + 4
|
|
|
&& (paramValue.contains(" "+keyword)||paramValue.contains(keyword+" ")||paramValue.contains(" "+keyword+" "))) {
|
|
|
paramValue = StringUtils.replace(paramValue, keyword, replacedString);
|
|
|
log.error(this.currentUrl + "已被过滤,因为参数中包含不允许sql的关键词(" + keyword
|
|
|
+ ")"+";参数:"+value+";过滤后的参数:"+paramValue);
|
|
|
}
|
|
|
}
|
|
|
return paramValue;
|
|
|
}
|
|
|
}
|