针对原有项目 通用查询的拼接sql,防止sql注入的校验

接收到前端参数,对参数的值进行校验,收集了一些常见的绕过方式

public class CheckSqlParamUtils {
    /**
     * 对前端的传参进行校验,对除了了id外的每个参数进行校验,true为未通过sql注入校验
     * @param map
     * @return
     */
    private static final Logger logger = LoggerFactory.getLogger(CheckSqlParamUtils.class);
    public static boolean mapCheck(Map<String,String> map){
        if (map.isEmpty()){
            return false;
        }
        for (Map.Entry<String, String> entry : map.entrySet()) {
            if(!"id".equals(entry.getKey())){
                if (sqlCheck(entry.getValue())){
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean sqlCheck(String sql) {
        sql = sql.toUpperCase();
        //注入字符校验
        String dangerWord = "exec|insert|select|delete|update|union|and|from|database|drop|create|like|rlike|regexp|count|chr|truncate|declare|or|join|offset" +
                "all|alter|kill" ;
        String dangerWordUpper = dangerWord.toUpperCase();
        String dangerWordArr[] = dangerWordUpper.split("\\|");
        for (int i = 0 ; i < dangerWordArr.length; i++ ) {
            String key = dangerWordArr[i];
            if(sql.contains(" " + key)
                    || sql.contains(key + " ")
                    || sql.contains(key+"(")){
                logger.info("未通过sql关键字校验,未通过值为",sql);
                return true;
            }
        }
        //注入函数校验
        String dangerFun = "mid(|char(|ascii(|substr(|abs(|rand(|exp(|concat(|CHARSET(|VERSION(|CONNECTION_ID(|COUNT(|" +
                "AVG(|sign(|INSERT(|greatest(|least(strcmp(|left(|right(|ascii(|hex(";
        if (containDangerKey(sql,dangerFun,"\\|")){
            logger.info("未通过sql函数校验,未通过值为",sql);
            return true;
        }
        //针对空格绕过校验
        String dangerBlank = "%20|%09|%0a|%0b|%0c|%0d|%a0|%00|/*|*/|/*!*/\\N|";
        if (containDangerKey(sql,dangerBlank,"\\|")){
            logger.info("未通过sql空格绕过校验,未通过值为",sql);
            return true;
        }
        //针对特殊字符校验
        String dangerMark = ".I;I:I#I%I+I-I=I//I@I\"I--I<I>I&&I||I`";
        if (containDangerKey(sql,dangerMark,"I")){
            logger.info("未通过sql特殊符号校验,未通过值为",sql);
            return true;
        }
      
        return false;
    }

    public static boolean containDangerKey(String sql, String dangerStr,String regex){
        String dangerStrLow = dangerStr.toLowerCase();
        String[] dangerStrs = dangerStrLow.split(regex);
        for (int i = 0; i < dangerStrs.length; i++) {
            String key = dangerStrs[i];
            if(sql.contains(key)) {
                return true;
            }
        }
        return false;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值