天道不一定酬所有勤
但是,天道只酬勤

ibatis防止sql注入

之前在ibatis直接执行已有sql语句中记录了如何直接执行sql语句。

想要执行这样一个语句,根据用户输入的条件,查询分数大于(小于、等于、大于等于、小于等于)某分数的应用的信息,但是查询的条件(大于、小于等)也是需要用户传进来的符号,所以代码这样写:

<select id="selectAppNames" parameterClass="java.util.Map" resultClass="measureResultDO">
        select * from apaas_measure_result WHERE 1 = 1
        <dynamic>
             <isNotNull property="nodeId" prepend="and">
                 node_id=#nodeId#
             </isNotNull>
             <isNotNull property="symbol" prepend="and">
               <isNotNull property="numeric">
                   score $symbol$ #numeric#
               </isNotNull>
             </isNotNull>
        </dynamic>
    </select>

但是在ibatis的SQLMAP文件中使用$value$引入变量存在SQLInjection漏洞。
所以,将代码改成如下:

<select id="selectAppNames" parameterClass="java.util.Map" resultClass="measureResultDO">
        select * from apaas_measure_result WHERE 1 = 1
        <dynamic>
             <isNotNull property="nodeId" prepend="and">
                 node_id=#nodeId#
             </isNotNull>
             <isNotNull property="symbol" prepend="and">
               <isNotNull property="numeric">
                   score $symbol:SQLKEYWORD$ #numeric#
               </isNotNull>
             </isNotNull>
        </dynamic>
    </select>

基本规则

用户使用的sql代码中能用#name#代替$name$的尽量用#name#替换.sql代码中不应当出现$符合的变量.($引入的变量会导致sql注入的风险)
以下说明order by和sort 需要输入动态参数时的处理方式

order by e.g.

select TABLE_NAME,TABLESPACE_NAME from user_tables order by $orderByColumn$ .

其中orderByColumn是数据库中的字段. 对这种元数据的请使用:$orderByColumn:METADATA$替换$orderByColumn$.

sort e.g.

select TABLE_NAME,TABLESPACE_NAME from user_tables order by TABLE_NAME $ordertype$

其中ordertype为用户输入的ASC,DESC.对这种关键字请使用 $ordertype:SQLKEYWORD$替换 $ordertype$ .

(全文完)
欢迎关注HollisChuang微信公众账号
打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » ibatis防止sql注入

分享到:更多 ()

HollisChuang's Blog

联系我关于我