懒羊羊
2024-01-31 e57a8990ae56f657a59c435a0613c5f7a8728003
提交 | 用户 | 时间
e57a89 1 package com.jcdm.common.utils.sql;
2
3 import com.jcdm.common.exception.UtilException;
4 import com.jcdm.common.utils.StringUtils;
5
6 /**
7  * sql操作工具类
8  * 
9  * @author jc
10  */
11 public class SqlUtil
12 {
13     /**
14      * 定义常用的 sql关键字
15      */
16     public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()";
17
18     /**
19      * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
20      */
21     public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
22
23     /**
24      * 限制orderBy最大长度
25      */
26     private static final int ORDER_BY_MAX_LENGTH = 500;
27
28     /**
29      * 检查字符,防止注入绕过
30      */
31     public static String escapeOrderBySql(String value)
32     {
33         if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
34         {
35             throw new UtilException("参数不符合规范,不能进行查询");
36         }
37         if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH)
38         {
39             throw new UtilException("参数已超过最大限制,不能进行查询");
40         }
41         return value;
42     }
43
44     /**
45      * 验证 order by 语法是否符合规范
46      */
47     public static boolean isValidOrderBySql(String value)
48     {
49         return value.matches(SQL_PATTERN);
50     }
51
52     /**
53      * SQL关键字检查
54      */
55     public static void filterKeyword(String value)
56     {
57         if (StringUtils.isEmpty(value))
58         {
59             return;
60         }
61         String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
62         for (String sqlKeyword : sqlKeywords)
63         {
64             if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
65             {
66                 throw new UtilException("参数存在SQL注入风险");
67             }
68         }
69     }
70 }