sql语句中一些特殊字符的处理

为了防止SQL注入,同时避免用户输入特殊字符时查询结果不准确的问题(特别是 % _ ' 这三个字符)

    public static String escapeSQL(String str) {
        if (str == null || str.length() == 0) {
            return str;
        }
        String[] chars = new String[4], escape = new String[4];
        chars[0] = "\\";
        escape[0] = "\\\\\\\\";
        chars[1] = "\n";
        escape[1] = "\\\\n";
        chars[2] = "'";
        escape[2] = "''";
        chars[3] = "\r";
        escape[3] = "\\\\r";
        for (int i = 0; i < chars.length; ++i) {
            str = str.replace(chars[i], escape[i]);
        }
        str = str.replace("%", "\\%").replace("_", "\\_");
        return str.trim();
    }

这样处理的弊端:当用户输入带%或_的查询条件时, 会查不到数据。

解决办法 :动态加上ESCAPE '\'语句

 

sql语句:

<select id="SELECT.A_USR_S02.GET_LIST_USER"
            parameterClass="my.com.honda.servicebooking.a_usr.dto.A_USR_S02_Input"
            resultClass="my.com.honda.servicebooking.a_usr.dto.A_USR_S02_Output">
        <include refid="sql_head" />
        <dynamic prepend="and">
            <isNotEmpty property="userType" prepend="">
                U.USER_TYPE=#userType#
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="and">
            <isNotEmpty property="userStatus" prepend="">
                U.USER_STATUS=#userStatus#
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="and">
            <isNotEmpty property="userName" prepend="">
                <isNotEmpty property="userNameSingleQuotes" prepend="">
                    UPPER(U.USER_NAME) LIKE UPPER(' %$userName$% ')   //此处检测当输入的查询条件中含有单引号',就不用 '%'||#userName#||'%',

                </isNotEmpty>                                                                             而用%$userName$%

                <isEmpty property="userNameSingleQuotes" prepend="">     
                    UPPER(U.USER_NAME) LIKE UPPER( '%'||#userName#||'%' )
                </isEmpty>
                <isNotEmpty property="userNamePercentOrUnderline" prepend="">
                    ESCAPE '\'       //此处检测当输入的查询条件含有%或者_时,就加上 ESCAPE '\'
                </isNotEmpty>
            </isNotEmpty>
        </dynamic>    
        <dynamic prepend="and">
            <isNotEmpty property="idUser" prepend="">
                <isNotEmpty property="idUserSingleQuotes" prepend="">
                    UPPER(U.USER_ID) LIKE UPPER('%$idUser$%')
                </isNotEmpty>
                <isEmpty property="idUserSingleQuotes" prepend="">
                    UPPER(U.USER_ID) LIKE UPPER('%'||#idUser#||'%')
                </isEmpty>
                <!-- idUser have % or _  -->
                <isNotEmpty property="idUserPercentOrUnderline" prepend="">
                    ESCAPE '\'
                </isNotEmpty>
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="and">
            <isNotEmpty property="svcCtrCode" prepend="">
                S.SVC_CTR_CODE=#svcCtrCode#
            </isNotEmpty>
        </dynamic>
        <dynamic>
            ORDER BY UPPER(U.USER_ID) ASC,
                UPPER(U.USER_NAME) ASC
        </dynamic>
    </select>

 

 

 

 

由于前面加了%和_的处理,那么单引号用这种方法就查不到数据了

解决办法:将'%'||#userName#||'%'替换成%$userName$%  

*注: $param$ 是ibatis内部自带的,而#param#是oracle自带的,两者想过等价


 

 

转载于:https://www.cnblogs.com/chengfang/archive/2012/12/13/SQL.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值