模糊查询LIKE语句的SQL注入预防

一、在 iBatis或者myBatis模糊查询的LIKE语句避免采用如下写法,否则会导致SQL注入;
[sql]  view plain  copy
  1.    <select id="INSTITUTIONS-GET-PARAMS" resultMap="INSTITUTIONSDO-MAP" parameterClass="java.util.Map">  
  2. <![CDATA[  
  3. SELECT /*INSTITUTIONS-CLASSIFICATION-GET-ALL-COUNT */   
  4.     i.id,  
  5.     i.institution_name,  
  6.     i.institution_short_name,  
  7.     i.create_time,  
  8.     i.agency_headquarters,  
  9.     i.registration_site,  
  10.     i.website_url,  
  11.     i.brief_introduction,  
  12.     i.logo_url,  
  13.     i.hot   
  14. FROM ins i   
  15. ]]>  
  16. <isNotEmpty property="categoryCode">  
  17.     LEFT JOIN ins_industry ii   
  18.             ON i.id = ii.institutionId  
  19.         LEFT JOIN ind_type it   
  20.             ON it.id = ii.typeId   
  21. </isNotEmpty>  
  22. where 1=1   
  23. <dynamic>  
  24.     <isNotEmpty property="categoryCode"  prepend=" AND ">  
  25.         <![CDATA[  
  26.         it.category_code = #categoryCode#   
  27.         ]]>  
  28.     </isNotEmpty>  
  29.     <isNotEmpty property="institutionName"  prepend=" AND ">  
  30.         i.institution_short_name LIKE '%$institutionName$%'   
  31.     </isNotEmpty>  
  32.     ORDER BY i.hot ASC   
  33.     <isNotEmpty property="start">  
  34.       LIMIT #start#,   
  35.         <isNotEmpty property="size">  
  36.             #size#  
  37.         </isNotEmpty>  
  38.     </isNotEmpty>  
  39. </dynamic>  
  40.  </select>  

    如上SQL语句,如果用户输入: %' AND 2498=2498 AND '%'=',会构成如下SQL,精简后如下,是能正确返回记录的,即存在SQL注入:
[sql]  view plain  copy
  1.         SELECT   
  2.     i.id,  
  3.     i.institution_name,  
  4.     i.institution_short_name,  
  5.     i.create_time,  
  6.     i.agency_headquarters,  
  7.     i.registration_site,  
  8.     i.website_url,  
  9.     i.brief_introduction,  
  10.     i.logo_url,  
  11.     i.hot   
  12. FROM ins i   
  13.     LEFT JOIN ins_industry ii   
  14.             ON i.id = ii.institutionId  
  15.         LEFT JOIN ind_type it   
  16.             ON it.id = ii.typeId   
  17. where 1=1 AND   
  18.         i.institution_short_name LIKE '%%' AND 2498=2498 AND '%'='%'   
  19. ORDER BY i.hot ASC LIMIT 0, 10   


     二、解决办法:
           1、尽量避免采用$的方式,$会导致SQL注入, LIKE '%$institutionName$%' 和  LIKE  concat( '%',$institutionName$,'%') 都会导致SQL注入
           2、尽量采用 #的方式,#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号; 更详细的可以查看$和#的区别;
           3、对于例子中的模糊查询, 可以用#结合 concat函数,即修改为 LIKE concat('%',#institutionName#,'%') ;也可以
可以将LIKE '%${Name}%'修改为LIKE '%'||#{Name}||'%'
           4、以上只是编码LIKE语句的SQL注入防范,实际中需要对用户输入进行过滤处理;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值