zoukankan      html  css  js  c++  java
  • SQL注入问题

    斌斌 (给我写信) 原创博文(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),转载请注明 出处

  • 相关阅读:
    表的设计
    改善C#公共程序类库质量的10种方法和工具
    模块化编程
    Linux centOS本地DNS安装
    C#多线程解决界面卡死问题
    图解JOIN
    轻量级前端MVVM框架avalon
    免费的Visual Studio的插件
    Composite C1是一个.Net平台上开源专业的CMS开源项目
    NDepend 3.0已与Visual Studio集成
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3167696.html
Copyright © 2011-2022 走看看