private static final Pattern PATTERN = Pattern.compile("\\b(\\s*and\\s*|\\s*exec\\s*|\\s*insert\\s*|\\s*select\\s*|\\s*drop\\s*|\\s*grant\\s*|\\s*alter\\s*|\\s*" +
"delete\\s*|\\s*update\\s*|\\s*count\\s*|\\s*chr\\s*|\\s*mid\\s*|\\s*master\\s*|\\s*truncate\\s*|\\s*char\\s*|\\s*declare\\s*|\\s*or\\s*)\\b|(\\*|;|\\+)");
protected static boolean sqlValidate(String str){
String s = str.toLowerCase();
Matcher matcher = PATTERN.matcher(s);
return matcher.find();
}
public static String judgeSqlInject(Map<String, Object> paras) {
if (MapUtils.isEmpty(paras)) {
return null;
}
for (String key:paras.keySet()) {
Object val = paras.get(key);
if (Objects.isNull(val)) {
continue;
}
if (val instanceof List) {
List<Map<String, Object>> list = (List<Map<String, Object>>)val;
for (Map<String, Object> map:list) {
String value = judgeSqlInject(map);
if (!StringUtils.isBlank(value)) {
Log.info("【存在sql注入风险】 {}", key);
return key + " 存在sql注入风险";
}
}
} else if (val instanceof Map) {
Map<String, Object> map = (Map<String, Object>)val;
String value = judgeSqlInject(map);
if (!StringUtils.isBlank(value)) {
Log.info("【存在sql注入风险】 {}", key);
return key + " 存在sql注入风险";
}
} else {
String value = String.valueOf(val);
if (sqlValidate(value)) {
Log.info("【存在sql注入风险】 {}", key);
return key + " 存在sql注入风险";
}
}
}
return null;
}