improvement:调优sql关键词过滤方法

This commit is contained in:
Chopper711 2023-08-16 16:37:58 +08:00
parent 8104947aec
commit a62db61221

View File

@ -1,8 +1,9 @@
package cn.lili.modules.search.utils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import cn.lili.common.utils.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* sql 关键字过滤
@ -15,13 +16,15 @@ import java.util.Set;
public class SqlFilter {
private static final Set<String> SQL_KEYWORDS = new HashSet<>(Arrays.asList(
"SELECT", "FROM", "WHERE", "AND", "OR", "NOT", "INSERT", "UPDATE", "DELETE", "CREATE",
"TABLE", "INDEX", "VIEW", "DROP", "ALTER", "COLUMN", "ADD", "SET", "GROUP", "BY",
"HAVING", "ORDER", "ASC", "DESC", "LIKE", "IN", "BETWEEN", "IS", "NULL", "TRUE", "FALSE",
"JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "ON", "AS", "DISTINCT", "COUNT",
"MAX", "MIN", "SUM", "AVG", "IF", "RAND", "UPDATEXML", "EXTRACTVALUE", "LOAD_FILE", "SLEEP","OFFSET"
));
// SQL注入过滤
static final String SQL_KEYWORDS_PATTERN =
"(?i)(SELECT|FROM|WHERE|CONCAT|AND|OR|NOT|INSERT|UPDATE|DELETE|CREATE" +
"|TABLE|INDEX|VIEW|DROP|ALTER|COLUMN|ADD|SET|GROUP|BY" +
"|HAVING|ORDER|ASC|DESC|LIKE|IN|BETWEEN|IS|NULL|TRUE|FALSE" +
"|JOIN|LEFT|RIGHT|INNER|OUTER|FULL|ON|AS|DISTINCT|COUNT" +
"|MAX|MIN|SUM|AVG|IF|RAND|UPDATEXML|EXTRACTVALUE|LOAD_FILE|SLEEP|OFFSET)";
static final Pattern keywordPattern = Pattern.compile(SQL_KEYWORDS_PATTERN, Pattern.CASE_INSENSITIVE);
/**
@ -31,29 +34,12 @@ public class SqlFilter {
* @return
*/
public static Boolean hit(String sql) {
String[] tokens = sql.split("\\s+");
for (String token : tokens) {
if (!SQL_KEYWORDS.contains(token.toUpperCase())) {
return true;
}
if (StringUtils.isEmpty(sql)) {
return false;
}
return false;
Matcher matcher = keywordPattern.matcher(sql);
return matcher.find();
}
/**
* 关键字替换
*
* @param sql
* @return
*/
public static String filterSql(String sql) {
String[] tokens = sql.split("\\s+");
StringBuilder filteredSql = new StringBuilder();
for (String token : tokens) {
if (!SQL_KEYWORDS.contains(token.toUpperCase())) {
filteredSql.append(token).append(" ");
}
}
return filteredSql.toString().trim();
}
}