SQL注入问题

系统 1834 0

斌斌  ( 给我写信 ) 原创博文(http://blog.csdn.net/binbinxyz),转载请注明 出处

背景: 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义交给了数据库,不会出现注入问题;如果采用$写法,则相当于拼接字符串,会出现注入问题。

在使用ibatis时,我们的查询一般按如下写法进行配置。

    <!-- sql 1 -->

<select id="selectAll"  resultClass="EMP" parameterClass="EMP">

 SELECT * FROM EMP WHERE NAME=#name#

</select>
  


这个SQL语句的作用是查询EMP表中名称为name的所有信息,是个精确查询。这种写法是采用PreparedStatement实现的,所以没有sql注入的风险。如果上述的查询是模糊查询,是不是可以按如下写法修改呢?

    <!-- sql 2 -->

<select id="selectAll"  resultClass="EMP" parameterClass="EMP">

 SELECT * FROM EMP WHERE NAME LIKE #name#

</select>
  


答案是否定的,因为以上两种写法的作用其实是完全一样的。模糊查询的一种简单实现如下:

    <!-- sql 3 -->

<select id="selectAll"  resultClass="EMP" parameterClass="EMP">

 SELECT * FROM EMP WHERE NAME LIKE '%$name$%'

</select>
  



但此时会导致sql注入问题,比如参数name传进"12345%' or '1%' = '1",生成的sql语句会是:

    SELECT * FROM EMP WHERE NAME='%12345%' or '1%' = '1%'
  



尽管name不一定匹配,但是or后面那句是恒等的,所以还是可以查出EMP中所有的记录。
解决方案:

    <!-- sql 4.1 oracle -->

<select id="selectAll"  resultClass="EMP" parameterClass="EMP">

 SELECT * FROM EMP WHERE NAME LIKE '%'||#name#||'%'

</select>

<!-- sql 4.2 mysql -->

<select id="selectAll"  resultClass="EMP" parameterClass="EMP">

 SELECT * FROM EMP WHERE NAME LIKE CONCAT('%', #name#, '%')

</select>
  


斌斌  ( 给我写信 ) 原创博文(http://blog.csdn.net/binbinxyz),转载请注明 出处

SQL注入问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论