package cn.lili.modules.search.utils; import cn.lili.common.utils.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * sql 关键字过滤 * * @author liushuai(liushuai711 @ gmail.com) * @version v4.0 * @Description: * @since 2023/3/22 17:27 */ public class SqlFilter { // SQL注入过滤 static final String SQL_KEYWORDS_PATTERN = "(?i)(SELECT|FROM|WHERE|CONCAT|AND|NOT|INSERT|UPDATE|DELETE" + "|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)"; // OR 影响排序字段 sort,所以暂时不过滤 // CREATE 影响常用排序字段, CREATE_TIME,所以暂时不过滤 static final Pattern keywordPattern = Pattern.compile(SQL_KEYWORDS_PATTERN, Pattern.CASE_INSENSITIVE); /** * 关键字命中 * * @param sql * @return */ public static Boolean hit(String sql) { if (StringUtils.isEmpty(sql)) { return false; } Matcher matcher = keywordPattern.matcher(sql); return matcher.find(); } }