SqlUtils 工具类

一、类代码展示

作用:校验sql注入风险

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SqlUtil {

    /**
     * 定义常用的 sql关键字
     */
    public static final String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare ";

    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
     */
    public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";

    /**
     * 检查字符,防止注入绕过
     */
    public static String escapeOrderBySql(String value) {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
            throw new UtilException("参数不符合规范,不能进行查询");
        }
        return value;
    }

    /**
     * 验证 order by 语法是否符合规范
     */
    public static boolean isValidOrderBySql(String value) {
        return value.matches(SQL_PATTERN);
    }

    /**
     * SQL关键字检查
     * 一般检查传入参数的sql注入风险
     */
    public static void filterKeyword(String value) {
        if (StringUtils.isEmpty(value)) {
            return;
        }
        //传入value中是否存在 SQL_REGEX中的数据库关键词
        String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
        for (String sqlKeyword : sqlKeywords) {
            if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) {
                throw new UtilException("参数存在SQL注入风险");
            }
        }
    }


}

二、测试检查sql关键字

方法:filterKeyword

    public static void main(String[] args) {
        filterKeyword("select * from user");
    }

打印结果

Exception in thread "main" com.ruoyi.common.exception.UtilException: 参数存在SQL注入风险
	at com.ruoyi.common.utils.sql.SqlUtil.filterKeyword(SqlUtil.java:55)
	at com.ruoyi.common.utils.sql.SqlUtil.main(SqlUtil.java:61)

三、测试校验排序

方法:isValidOrderBySql    :

  •  仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
  • 过滤规则: SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"

 常用排序举例:

 支持的用法如下:
 order by id asc
 order by id asc,create_time asc
 order by id desc,create_time desc
 order by id asc,create_time desc
  public static void main(String[] args) {
        //filterKeyword("select * from user");
        Console.log(isValidOrderBySql("id"));

        Console.log(isValidOrderBySql("id,sex"));

        Console.log(isValidOrderBySql("id,nick_name"));

        Console.log(isValidOrderBySql("id_,"));

        Console.log("校验不通过----------------------------------------");
        Console.log(isValidOrderBySql("id="));


    }

测试将结果:

true
true
true
true
校验不通过----------------------------------------
false

你可能感兴趣的:(JAJA常用工具类整理,DEOM展示,开箱即用,RuoYi-Vue-Plus,java)