脚手架完善

This commit is contained in:
谭凯凯 2025-02-12 10:46:27 +08:00 committed by Tankaikai
parent 6524caea92
commit 293323ff6a
1 changed files with 23 additions and 14 deletions

View File

@ -1,6 +1,8 @@
package com.czg.utils; package com.czg.utils;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import java.util.Objects;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@ -10,14 +12,15 @@ import java.util.regex.Pattern;
*/ */
public class SqlUtil { public class SqlUtil {
/** /**
* 定义常用的 sql关键字 * SQL语法检查正则符合两个关键字有先后顺序才算匹配
*/ */
private static final Pattern SQL_KEYWORD_PATTERN = Pattern.compile("(?i)(and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |\\+|user\\(\\))"); private static final Pattern SQL_SYNTAX_PATTERN = Pattern.compile("(insert|delete|update|select|create|drop|truncate|grant|alter|deny|revoke|call|execute|exec|declare|show|rename|set)" +
"\\s+.*(into|from|set|where|table|database|view|index|on|cursor|procedure|trigger|for|password|union|and|or)|(select\\s*\\*\\s*from\\s+)" +
"|if\\s*\\(.*\\)|select\\s*\\(.*\\)|substr\\s*\\(.*\\)|substring\\s*\\(.*\\)|char\\s*\\(.*\\)|concat\\s*\\(.*\\)|benchmark\\s*\\(.*\\)|sleep\\s*\\(.*\\)|(and|or)\\s+.*", Pattern.CASE_INSENSITIVE);
/** /**
* 仅支持字母数字下划线空格逗号小数点支持多个字段排序 * 使用';或注释截断SQL检查正则
*/ */
private static final Pattern SQL_PATTERN = Pattern.compile("[a-zA-Z0-9_\\ \\,\\.]+"); private static final Pattern SQL_COMMENT_PATTERN = Pattern.compile("'.*(or|union|--|#|/\\*|;)", Pattern.CASE_INSENSITIVE);
/** /**
* 限制orderBy最大长度 * 限制orderBy最大长度
@ -29,7 +32,7 @@ public class SqlUtil {
*/ */
public static String escapeOrderBySql(String value) { public static String escapeOrderBySql(String value) {
if (StrUtil.isNotEmpty(value)) { if (StrUtil.isNotEmpty(value)) {
if (!isValidOrderBySql(value)) { if (!check(value)) {
throw new IllegalArgumentException("参数不符合规范,不能进行查询"); throw new IllegalArgumentException("参数不符合规范,不能进行查询");
} }
if (value.length() > ORDER_BY_MAX_LENGTH) { if (value.length() > ORDER_BY_MAX_LENGTH) {
@ -40,18 +43,24 @@ public class SqlUtil {
} }
/** /**
* 验证 order by 语法是否符合规范 * 检查参数是否存在 SQL 注入
*
* @param value 检查参数
* @return true 非法 false 合法
*/ */
public static boolean isValidOrderBySql(String value) { public static boolean check(String value) {
return SQL_PATTERN.matcher(value).matches(); Objects.requireNonNull(value);
// 处理是否包含SQL注释字符 || 检查是否包含SQL注入敏感字符
return SQL_COMMENT_PATTERN.matcher(value).find() || SQL_SYNTAX_PATTERN.matcher(value).find();
} }
/** /**
* SQL关键字检查 * 刪除字段转义符单引号双引号
*
* @param text 待处理字段
*/ */
public static void filterKeyword(String value) { public static String removeEscapeCharacter(String text) {
if (StrUtil.isNotEmpty(value) && SQL_KEYWORD_PATTERN.matcher(value).find()) { Objects.nonNull(text);
throw new IllegalArgumentException("参数存在 SQL 注入风险"); return text.replaceAll("\"", "").replaceAll("'", "");
}
} }
} }