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

数据库 waitig 803℃ 百度已收录 0评论

一、在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-ALLCOUNT */   
  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注入防范,实际中需要对用户输入进行过滤处理;  


本文由【waitig】发表在等英博客
本文固定链接:模糊查询LIKE语句的SQL注入预防
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)